Welcome, Guest
Username: Password: Remember me
Hier wird Deutsch gesprochen
  • Page:
  • 1

TOPIC:

Anzeige mittels Panel 05 Apr 2022 09:31 #22082

  • lagraf
  • lagraf's Avatar
  • Topic Author


  • Posts: 310
  • Ich habe ein C# Beispiel aus dem Internet nach X# übersetzt und möchte einen QRCode mit Panel anzeigen:
    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?

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 05 Apr 2022 09:35 #22083

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • Hallo Franz,
    dieser Code ist nicht komplett.... Es fehlt der Teil, wo das Panel zu einem Fenster hinzugefügt wird.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 05 Apr 2022 11:22 #22085

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Wolfgang,
    ich habe mir eine Klasse in C# gebaut, wo ein Form angezeigt wird, in das ich das Panel integriere:
    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?

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 05 Apr 2022 17:45 #22088

    • FFF
    • FFF's Avatar


  • Posts: 1377
  • Wenn Du dem Panel erstmal ein Panel1:BackColor := System.Drawing.Color.FromArgb( 0,0,255 ) verpaßt, sieh man dann das Blaue Rechteck?
    Regards
    Karl (X# 2.13.0.6; Xide 1.32; W8.1/64 German)

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 09:01 #22093

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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:
    public class Program
    {
    	static void Main()
    	{
    		Application.Run(new Frames01());
    ...
    während ich das X# Fenster aus dem EmptyShellMenü einer StandardSDIApp aufrufe:
    CLASS StandardSDIWindow INHERIT DataWindow
    METHOD MyQRCodeShow()
    	LOCAL oQRCode AS Frames01
    	LOCAL lReturn AS LOGIC
    	oQRCode := Frames01{"Hello World", 5}
    ...

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 09:13 #22094

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • 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:
    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.

    File Attachment:

    File Name: VOGuiWinforms.zip
    File Size:8 KB
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it
    Attachments:

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 09:40 #22095

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • 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

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 10:25 #22096

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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?

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 11:50 #22098

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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?

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 11:52 #22099

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • 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

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 11:58 #22100

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • Hallo Franz,
    eigentlich sollte das schon funktionieren.
    Was sagt der Debugger hier?
    Begin ... end using brauchst Du nicht zu verwenden.
    Das End Using kümmert sich nur darum, das entsprechende Objekt nachher per :Dispose() wieder aufzuräumen.
    Ich denke aber, dass das Rendern der Grafik bei jedem Refresh des Fensters passieren muss - das ist zumindestens bei VO so, und ich weiß nicht, wie das bei WinForms geht.
    Welche QRcode-Library verwendest Du hier?
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 06 Apr 2022 14:10 #22102

    • Chris
    • Chris's Avatar


  • Posts: 3652
  • Hi Franz,

    In addition to what the guys have said, this code does not include something to show the window:

    lagraf wrote:

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


    What happens if you add a

    oQRCode:Show()

    at the end, does it now show the window with the control in it?

    .
    XSharp Development Team
    chris(at)xsharp.eu

    Please Log in or Create an account to join the conversation.

    Last edit: by Chris.

    Anzeige mittels Panel 07 Apr 2022 09:21 #22105

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Chris,
    Wolfgang said that the problem is that a WinForms window is called out of a VOGUI so he gave me an example to do this with ChildWinForm. This runs but the remaining problem is that the QRCode graphics is not shown at the window:
    panel := Panel{}
    panel:AutoSize := TRUE
    graphics := panel:CreateGraphics()     // creates a graphics object
    renderer:Draw(graphics, qrCode:Matrix, padding)     // paints qrCode into graphics object
    textBox1 := System.Windows.Forms.TextBox{}
    panel:Controls:Add(textBox1)     // Add textBox1 to panel
    SELF:Controls:Add(panel)     // Add panel to window
    qrCode:Matrix should be right because I can save it to file, this code works:
    stream := FileStream{"c:\tmp\foo.bmp", FileMode.Create}
    renderer:WriteToStream(qrCode:Matrix, ImageFormat.Bmp, stream)
    I see the textBox1 but not the QRCode, what's the problem with qrCode:Matrix?

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Anzeige mittels Panel 07 Apr 2022 09:26 #22106

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Wolfgang,
    BEGIN und END habe ich weggelassen.
    Als QRCode Library verwende ich die Gma.QrCodeNet.Encoding.dll, daran kanns aber nicht liegen, denn ich kann den QRCode speichern. Mit dem Debugger habe ich mich noch nicht beschäftigt, was möchtest du damit sehen?
    Wie kann ich in X# am Einfachsten eine Anzeige machen und wie wird das dann angezeigt:
    - ? wie in VO
    - Console.Write

    Please Log in or Create an account to join the conversation.

    Anzeige mittels Panel 07 Apr 2022 09:34 #22107

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3191
  • Hallo Franz,
    schaue ich mir heute abend an.
    ? sollte gehen
    Console.Write läuft nur, wenn die App als Console-App definiert ist, sonst muss man die Console manuell erstellen. Wenn Du das brauchst, kann ich Dir den Code geben.
    Am sinnvollsten ist wie in VO eine Ausgabe mit DebugView, am besten DebugView++ verwenden und mit
    System.Diagnostics.Debug.WriteLine()
    oder einer der verwandten statischen Methoden rausschreiben.
    Alternativ bietet es sich auch an, eine Log-Datei zu schreiben.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    • Page:
    • 1
    Moderators: wriedmann