xsharp.eu • Anzeige mittels Panel
Page 1 of 2

Anzeige mittels Panel

Posted: Tue Apr 05, 2022 7:31 am
by lagraf
Ich habe ein C# Beispiel aus dem Internet nach X# übersetzt und möchte einen QRCode mit Panel anzeigen:

Code: Select all

local qrCode as QrCode
// Erzeugen des QRCodes funktioniert
panel := Panel{}
padding := System.Drawing.Point{10, 16}
dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
panel:AutoSize := FALSE
panel:Size := Size{dSize:CodeWidth, dSize:CodeWidth} + Size{2*padding:X, 2*padding:Y}
BEGIN USING VAR graphics := panel:CreateGraphics()
	renderer:Draw(graphics, qrCode:Matrix, padding)
END USING
Es passiert aber gar nichts, auch die Variante mit

Code: Select all

panel := Panel{}
padding := System.Drawing.Point{10, 16}
panel:AutoSize := TRUE
BEGIN USING VAR graphics := panel:CreateGraphics()
	renderer:Draw(graphics, qrCode:Matrix, padding)
END USING
bringt nichts am Bildschirm. Liegt das an der XIDE oder stimmt der von mir übersetzte Code nicht?

Anzeige mittels Panel

Posted: Tue Apr 05, 2022 7:35 am
by wriedmann
Hallo Franz,
dieser Code ist nicht komplett.... Es fehlt der Teil, wo das Panel zu einem Fenster hinzugefügt wird.
Wolfgang

Anzeige mittels Panel

Posted: Tue Apr 05, 2022 9:22 am
by lagraf
Hallo Wolfgang,
ich habe mir eine Klasse in C# gebaut, wo ein Form angezeigt wird, in das ich das Panel integriere:

Code: Select all

public class Frames01 : Form 
{
 public Frames01() 
	{
	this.Text = "C# - einfaches Form";	
	this.Size = new Size(900, 600);
	Panel panel = new Panel();
	this.Controls.Add(panel);
       }
}
Rufe ich die Klasse Frames01 auf, wird mir ein leeres Fenster angezeigt. Ich habe auch schon ein paar Controls am Panel definiert, die ebenfalls angezeigt werden. Stelle ich das nun auf X# um, schaut das dann so aus:

Code: Select all

PUBLIC CLASS Frames01 INHERIT Form
	PUBLIC CONSTRUCTOR()
                LOCAL panel AS Panel
		SELF:Text := "X# - einfaches Form"
		SELF:Size := size{900, 600}
		panel := Panel{}
		SELF:Controls:Add(panel)
		RETURN
END CLASS
Allerdings wird beim Aufruf der Klasse Frames01 nichts angezeigt, woran kann das liegen?

Anzeige mittels Panel

Posted: Tue Apr 05, 2022 3:45 pm
by FFF
Wenn Du dem Panel erstmal ein Panel1:BackColor := System.Drawing.Color.FromArgb( 0,0,255 ) verpaßt, sieh man dann das Blaue Rechteck?

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 7:01 am
by lagraf
Hallo Karl,
die beiden Zeilen fürs Panel sind eigentlich nur die ersten Zeilen für die nachfolgende Anzeige von QRCode, Button, etc. Kann man für das eigentliche Problem beim X# Teil auch weglassen: Es wird nämlich nicht mal das Fenster angezeigt! Das C# Beispiel zeigt ein leeres Fenster (Panel enthält ja noch keine Controls), das X# sollte meine Übersetzung davon sein, bringt aber gar kein Fenster.

Der einzige Unterschied bei den beiden Beispielen ist der Aufruf:

Code: Select all

public class Program
{
	static void Main()
	{
		Application.Run(new Frames01());
...
während ich das X# Fenster aus dem EmptyShellMenü einer StandardSDIApp aufrufe:

Code: Select all

CLASS StandardSDIWindow INHERIT DataWindow
METHOD MyQRCodeShow()
	LOCAL oQRCode AS Frames01
	LOCAL lReturn AS LOGIC
	oQRCode := Frames01{"Hello World", 5}
...

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 7:13 am
by wriedmann
Hallo Franz,
was Du da probierst, ist ein Mix aus zwei verschiedenen GUI-Klassen: einmal die VOGUI-Klassen, und dann Windows Forms.
Das geht eigentlich nicht, es gibt aber Beispielcode, wie man das trotzdem machen kann.
Du möchtest nämlich ein Windows-Forms-Fenster innerhalb eines VOGUI-ShellWindows aufrufen.
Gibt es einen Grund, warum Du das nicht komplett in Windows Forms machst, sondern die VOGUI nutzen möchtest?
Wolfgang
P.S. ich habe Dir eine Beispiel-App angehängt. Der springende Punkt ist dieser Code:

Code: Select all

method OpenWFWindow() class StandardShellWindow
local oForm 	as WFWindow
local oChild as ChildWinForm

oChild := ChildWinForm{ self, true }
oChild:Menu := StandardShellMenu{ oChild }
oForm := WFWindow{ oChild }
oChild:WinForm := oForm
oChild:Caption := oForm:Text
oChild:Show()

return nil
oForm ist ein WindowsForms-Fenster.
VOGuiWinforms.zip
(8.27 KiB) Downloaded 65 times

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 7:40 am
by wriedmann
Hallo Franz,
nochmal als Hinweis, auch wenn das vielleicht als x-te Wiederholung klingt: ein nachvollziehbares Beispiel hilft nicht nur Dir, schneller eine Antwort zu finden, sondern auch uns, weniger Zeit für Suche in falschen Richtungen zu verschwenden.
Den eigentlichen Problem-Code hast Du erst heute früh gezeigt, nachdem bereits Karl und ich uns mit dem Problem beschäftigt hatten und aus erklärbaren Gründen keine Ursache finden konnten.
Wenn es gleich eine VIAEF-Datei gegeben hätte, mit der sich das Problem nachvollziehen lässt, hättest Du wahrscheinlich schnell eine Antwort bekommen.
Ich nehme an, Dir leuchtet es ein, dass keiner von uns die Zeit hat, aus Deinen Code-Fragmenten ein Beispiel zu bauen, um Dein Problem zu lösen. In diesem Fall wäre das auch komplett für die Fische gewesen, denn auch eine X#-Applikation, die Windows Forms verwendet, hätte das von Dir verwendete Problem nicht gezeigt - und einen Hinweis von Dir, dass es da um ein VOGUI-Programm geht, hat es bis heute früh auch keinen gegeben.
Ich verstehe schon, dass Du in Pension bist und Zeit für Dich keine so große Rolle mehr spielt wie für uns, die wir unsere Brötchen mit unserer Arbeit verdienen müssen - aber umso mehr solltest Du Dir angewöhnen, nachvollziehbare Beispiele zu liefern.
Wolfgang

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 8:25 am
by lagraf
Hallo Wolfgang,
sorry aber wenn ich gewußt hätte, dass dies nicht geht, dann wärs gar nicht zu dem Problem gekommen. Ich bin derzeit einfach nur ein wenig beim Testen und Ausprobieren und da bin ich wie in VO üblich vorgegangen:
- nimm die Standard SDI oder MDI App
- bau die Routinen dort als weiteren Menüpunkt ein
Dass dadurch eine hybride App zweier Welten entsteht, war mir nicht bewußt. Der Grund für das Ganze ist, weil ich nicht für jeden kleinen Test eine eigene App erstellen will, sondern diese Module einfach über Menüpunkte aufrufe. Sowas habe ich auch unter VO: eine TestApp mit über 50 verschiedenen Menüpunkten wo ich mit jedem eine bestimmte Problemstellung ausprobiere.

Das mit dem VIAEF File mag schon Vorteile bringen, hat mir aber auch schon gegenteilige Antwort erbracht: "Sollen wir uns durch den Code der gesamten App durcharbeiten? Bring doch nur das Codeschnipsel wo das Problem auftritt!" Wie man's macht, ist es meist verkehrt.

Ich bin trotzdem dankbar, dass ihr euch die Zeit nehmt und mir und anderen Usern hier im Forum weiterhelft. Grundsätzlich müßte ich mich auch nicht mit X# beschäftigen, nur will ich meine Kunden nicht kalt im Regen stehen lassen und möchte für den Zeitpunkt vorsorgen wo:
- VO auf neuen WinVersionen nicht mehr funktioniert
- der Gesetzgeber bei der verwendeten C# DLL aus einem früheren Posting eine Änderung verlangt

Ich würde mir trotzdem eine Doku wünschen, die nicht als Referenz aufgebaut ist sondern als Einführung von "Hello World" bis zur komplexen WinForms App, so wie es in diversen Büchern für VO oder C# gehandhabt wird. Bin ich da der Einzige?

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 9:50 am
by lagraf
Hallo Wolfgang,
ich habe mir dein Beispiel angesehen, das funktioniert also mittels ChildWinForm! Nun habe ich meinen Testcode zur Anzeige des QRCodes wie folgt eingebaut:

Code: Select all

METHOD InitializeForm() AS VOID
...
// Anzeige der RichTextBox ist auskommentiert, damit die anderen Elemente nicht überlagert werden!
SELF:QrCode("Hello World", 5)
SELF:ResumeLayout()
RETURN

METHOD QrCode(cText AS STRING, nSize AS DWORD) AS VOID
	LOCAL panel AS Panel
	LOCAL qrEncoder AS QrEncoder
	LOCAL qrCode AS QrCode
	LOCAL renderer AS GraphicsRenderer
	LOCAL padding AS System.Drawing.Point
	LOCAL dSize AS DrawingSize
	LOCAL textBox1 AS System.Windows.Forms.TextBox

	qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
	qrCode := qrEncoder:Encode(cText)
	renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
	padding := System.Drawing.Point{10, 16}
	dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)

	panel := Panel{}
	panel:AutoSize := FALSE
	panel:Size := Size{dSize:CodeWidth, dSize:CodeWidth} + Size{2 * padding:X, 2 * padding:Y}
	BEGIN USING VAR graphics := panel:CreateGraphics()
		renderer:Draw(graphics, qrCode:Matrix, padding)
	END USING
	
	textBox1 := System.Windows.Forms.TextBox{}
	textBox1:Location := System.Drawing.Point{16, 32}
	textBox1:Text := "TextBox"
	textBox1:Size := Size{152, 20}
	panel:Controls:Add(textBox1)

	SELF:Controls:Add(panel)

RETURN
Ich erzeuge den QRCode, adde ihn und eine textBox1 zum Panel und adde das Panel dann dem WinForms Fenster. Die TextBox wird angezeigt, der QRCode aber nicht. Ich denke dass demnach das Problem im Bereich BEGIN USING .. END USING liegen müßte. Dort wird eine Var graphics erzeugt und dieser der QRCode hinzugefügt. Was stimmt dabei nicht?

Anzeige mittels Panel

Posted: Wed Apr 06, 2022 9:52 am
by wriedmann
Hallo Franz,
zur Doku: da bist Du nicht der Einzige, das höre ich immer wieder.
Das große Problem bei der Doku ist ganz einfach, dass sich keine genügend große Schnittmenge finden lässt.
Anders als bei VO, wo die VO GUI Klassen die einzige GUI-Option waren, haben wir hier unter .NET mindestens zwei mehr, nämlich Windows Forms und WPF.
Dazu kommen diverse verschiedene Paradigmen: arbeitet man mit MVVM oder mit dem klassischen "schmutzigen" Stil wie in VO, wo Logik und Darstellung bunt gemixt sind.
Und wenn man sich für MVVM entscheidet: da gibt es mindestens 10 verschiedene Frameworks (nicht jeder macht es sich so schwer wie ich und baut es sich selber).
Und dann kommen wir zum nächsten Problem: Controls out of the box oder irgendeine kommerzielle Toolbox? Und wenn zweites, welche?

Es gab mal von mir die Idee, so was Ähnliches wie die VO GUI Klassen für X# zu bauen, basierend auf WPF, aber das ist eine Unmenge an Arbeit und das nächste Problem ist die drunterliegende Datenbank: DBF würde ich für neue Projekte nie mehr verwenden, und auch hier hat jeder einen anderen Bedarf und andere Vorstellungen.....
Meine Idee war es auch, eine Library mit allen möglichen Tools für X# zu bauen, damit so ein Framework drauf aufsetzen kann, aber ich habe nicht die Zeit, so was alleine zu machen - ich habe eh schon jede Menge Zeit ins Docs-Wiki gesteckt, und keine Ahnung, ob das überhaupt jemandem nützt.
Vielleicht könnte man auch dort ein paar Wie-macht-man-was Anleitungen hinterlegen....

Wolfgang

P.S. wenn Du C#-Code nach X# übertragen willst, nimm einfach die Standard-App vom Chris her und lege die Fenster dort hinter einzelne Buttons. Mache ich selber so.