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
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?
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:
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?
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:
CLASS StandardSDIWindow INHERIT DataWindow
METHOD MyQRCodeShow()
LOCAL oQRCode AS Frames01
LOCAL lReturn AS LOGIC
oQRCode := Frames01{"Hello World", 5}
...
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:
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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?
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:
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?
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.
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it