Wie am besten eine MessageBox bauen?

Für Fragen von Einsteigern und Programmieranfängern...
Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Wie am besten eine MessageBox bauen?

Beitrag von Nixsager »

Hi

Eins vorn weg, ich habe keine Ahnung von Objekten.
Ich will mir eine MessageBox bauen.
Zuerst dachte ich daran die ganzen Objekte nacheinander mit den angegebenen Werten anzuzeigen.
Bloß da sich die Objekte ändern können, z.B. ist die Breite eines Knopfes abhängig von dem Text den er anzeigen soll.
Und wenn der Rahmen der MessageBox in der sich der Knopf befindet zu klein ist, muss er ja vergrößert werden.
Ich denke die ganzen abhängigen Anpassungn wären mit Objekte einfacher. da man deren Eigenschaften wieder auslesen kann.

Wie ist sowas ambesten zu lösen, und hat einer einen Link für Anleitung zu dem Thema?

Gruß vom Nixsager.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Wie am besten eine MessageBox bauen?

Beitrag von compmgmt »

Willst du dir selbst eine MessageBox machen oder willst du eine MessageBox-Funktion aufrufen.
Bei letzterem:
MessageDlg - Zeigt eine Nachricht an, Buttons kann man selbst festlegen
ShowMessage - Zeigt eine Nachricht an, enthält einen OK Button
InputBox - Editfeld um einen String einzugeben, enthält einen OK und Abbrechen Button
MessageBox - Zeigt eine Nachricht an, Buttons kann man selbst festlegen (Nur Windows)

Hier dazu mal zwei Themen:
http://wiki.lazarus.freepascal.org/Dialog_Examples
https://msdn.microsoft.com/en-us/librar ... 05(v=vs.85).aspx (MessageBox von Windows)
Zuletzt geändert von compmgmt am Do 27. Okt 2016, 17:12, insgesamt 1-mal geändert.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten eine MessageBox bauen?

Beitrag von Nixsager »

Nixsager hat geschrieben:Ich will mir eine MessageBox bauen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Wie am besten eine MessageBox bauen?

Beitrag von compmgmt »

Das Problem mit dem Button: Du kannst Anchors setzen (Im Objektinspektor und auch zur Laufzeit). Standard ist Left und Top. Das heißt der Abstand zur oberen und linken Kante wird nicht verändert. Der Abstand zur unteren und rechten Kante kann verändert werden. Wenn du den Buttons bspw. nach unten rechts im Formular tust und die Anchors auf Right und Bottom stellst, wird sich der Button immer in der unteren Rechten Ecke befinden, egal wie sehr das Formular die Größe ändert. Probier einfach mal ein bisschen rum, das ist selbsterklärend.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie am besten eine MessageBox bauen?

Beitrag von wp_xyz »

Ich nehme an, du willst das lernen, also keine fertige Lösung wie z.B. MessageDlg oder Application.MessageBox o.ä. Es gibt auch ein MessageComposerPkg im Lieferumfang von Lazarus, mit dem man die Messagebox visuell erzeugen kann.

Falls sich irgendwas in dem Fenster in Abhängigkeit der Konfiguration, Benutzereingabe usw. ändern kann, ist es am günstigsten, mit Anchors zu arbeiten. Achtung: der Anchor-Editor, den du durch Klick auf die ... neben der Eigenschaft "Anchors" im Objectinspector öffnest, ist noch relativ instabil und stürzt manchmal ab --> häufig abspeichern! Du kannst da für jedes Steuerelement angeben, mit welchem anderen Steuerelement und an welcher Seite es verankert sein soll, und welche Abstände eingehalten werden sollen.

Außerdem wichtig: AutoSize. Bei einem Button z.B. ändert sich damit die Breite in Abhängigkeit von der Beschriftung. Bei einem Label auch wichtig: WordBreak, damit der Text ggfs in eine neue Zeile umgebrochen werden kann.

Achte beim Verankern darauf, dass die Abhängigkeiten einfach sind, z.B. vom oben nach unten, von links nach rechts. Falls du zu zirkulären Abhängkeiten gelangst, erhältst du oft einen gnadenlosen Absturz der IDE.

Ein Warnung noch: komplett verankerte Steuerelemente kann man mit der Maus nicht mehr verschieben - das hat mich schon einige Fluche gekostet.

Du siehst, ich bin nicht unbedingt ein Freund des Anchor-Editors, aber als ich das kürzlich einmal durchgezogen habe, wurde mir klar, wie einfach man damit erreicht, dass sich ein Formular z.B. automatisch auf höhere DPI oder die längeren/kürzeren Strings einer anderen Sprache anpasst.

Siehe auch den recht guten Wiki-Artikel http://wiki.lazarus.freepascal.org/Autosize_/_Layout (allerdings nur auf Englisch).

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten eine MessageBox bauen?

Beitrag von Nixsager »

So Meinte ich das nicht.
Eher was ist besser. Objekte zu bauen (und wenn ja gibt es leicht verständliche Anleitung) und die dann in der MessageBox-Funktion einzubinden, oder sie in der MessageBox-Funktion selbst zu bauen.
Es geht mehr um die Basis. Nicht darum das Fenster bzw. das Objekt das den Knopf beinhaltet zu anzupassen. Das muss ich so oder so. Nur mit welcher Methode ist es einfacher und besser zu lösen.
Wie gesagt, glaube ich wenn ich mir meine Objekte baue, ist es einfacher das Fester anzupassen.
Es geht zwar um ein Konsolen-Programm, aber das Prinzip ist ja das gleich wie bei einem GUI.

P.S.
Der zweite Link ist tot.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie am besten eine MessageBox bauen?

Beitrag von wp_xyz »

Nixsager hat geschrieben: was ist besser. Objekte zu bauen (und wenn ja gibt es leicht verständliche Anleitung) und die dann in der MessageBox-Funktion einzubinden, oder sie in der MessageBox-Funktion selbst zu bauen.
Keine Ahnung, was du meinst...

Nixsager hat geschrieben:
Es geht zwar um ein Konsolen-Programm, aber das Prinzip ist ja das gleich wie bei einem GUI.
Was willst du denn da mit einer Messagebox? Das ist ein Fenster, das aufpoppt, und dem Benutzer etwas mitteilt. Auf der Konsole gibt es das in der Regel nicht.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten eine MessageBox bauen?

Beitrag von Mathias »

Ich will mir eine MessageBox bauen.

Dies ist recht einfach, ich hatte mal eine MessageBox selbst gemacht, weil Dateinamen bei der Original MessageBox abgeschnitten wurden.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  BorderStyle := bsDialog;
  Constraints.minWidth := Button1.Width + 30;
  Button1.Anchors := [akBottom];
end;
 
procedure TForm1.FormShow(Sender: TObject);
var
  s: string;
begin
  s := 'C:\Ordner\Ordner\Ordner\Ordner\Ordner\Ordner\Ordner\Ordner\Ordner\Datei.dat';
 
  s += LineEnding + 'Hello World !';
  s += LineEnding + 'Hello World !';
  s += LineEnding + 'Hello World !';
  s += LineEnding + 'Hello World !';
 
  Caption := 'Hinweis';
  Label1.Caption := s;
  Label1.Left := 30;
  Label1.Top := 30;
  ClientWidth := Label1.Width + 60;
  ClientHeight := Label1.Height + 90;
  Button1.Left := ClientWidth div 2 - Button1.Width div 2;
end;   


Die Lösung hat sogar den Vorteil, es wird die Grösse automatisch an das Label angepasst, auch wen dieses mehrzeilig ist.
Ich denke, Buttongrösse anpassen oder mehrere Buttons sollten keine Hexerei mehr sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten eine MessageBox bauen?

Beitrag von Mathias »

Es geht zwar um ein Konsolen-Programm, aber das Prinzip ist ja das gleich wie bei einem GUI.

Ich habe gerade gesehen, das dies für die Konsole ist, dann guck mal diesen Link an, da hat es ein Menu und auch eine MessageBox welche sich der Grösse anpasst.

Läuft nur unter Windows perfekt.
viewtopic.php?f=29&t=8312
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten eine MessageBox bauen?

Beitrag von Nixsager »

wp_xyz hat geschrieben:Keine Ahnung, was du meinst...


Ich benutz jetzt der einfacheit halber mal Marken und Gotos, was ich im Programm durch Schleifen lösen würde.
Hier ein sehr grobes Beispiel wie ich es zuerst machen wollte.

Code: Alles auswählen

 
Procedure MessageBox(Variabeln)
begin
:Zeichnen
  RahmenZeichnen(Variabeln)
  TitelZeichnen('123')
  InfoTextZeichnen('123')
  Button1Zeichnen('1')
  Button2Zeichnen('12')
  Button3Zeichnen('123')
 
  If Width(RahmenZeichen) > (Width(Button1Zeichen)+Width(Button1Zeichen)+Width(Button1Zeichen)) then
    begin
      RahmenZeichen(Mit neuer Breite)
      Goto Zeichnen
    end
end
 

Ist hier jetzt zum Beispiel der Rahmen zu klein, muss ich den neu brerechnen und alles neu zeichnen.

Hier ein sehr grobes Beispiel wie ich denke das es besser ist.

Code: Alles auswählen

 
Procedure MessageBox(Variabeln);
var
  Rahmen : Frame
  Titel: Label
  Info: Label
  ButtonA : Array ofButton[0..3]
begin
  Titel.Text := '123'
  Info.Text := '123'
  Button[1].Text := '1'
  Button[2].Text := '12'
  Button[3].Text := '123'
  Button[1].Create
  Button[2].Create
  Button[3].Create
 
  If Width(Rahmen) > (Width(ButtonA[0])+Width(ButtonA[1])+Width(ButtonA[2])) then Rahmen(Mit neuer Breite)
  //Und dann erst alles Zeichen, weil ich Button[0].Width mir ja die aktelle Breite von Button[0] angegeben wird.
  //Durch Create werden mir ja die Breite der Knöpfe zurückgegeben.
end;
 

Ist hier jetzt zum Beispiel der Rahmen zu klein, muss ich den Rahmen und alles neu zeichnen.

Wie gesagt, ich habe keine Ahnung und verweise auf meine Signatur.
Wie gesagt was besser ich externe Objekte nutze oder wenn ich jedes mal die Objekte in der Funktion baue.
Ist das nicht der Sinn solcher Objekte, das man sie mehrmals verwenden kann, und der Code damit nicht so aufgebläht wird?

wp_xyz hat geschrieben:Was willst du denn da mit einer Messagebox? Das ist ein Fenster, das aufpoppt, und dem Benutzer etwas mitteilt. Auf der Konsole gibt es das in der Regel nicht.

Und die Ausnahmen nennt sich TUI.

P.S.
Ich glaube einfacher wäre es gewesen den Code den ich mir zusammen geschustert haben zu posten.

@Mathias
Du hättet ja auch alles in einer Routine unterbringen können.
Du das ist die Frage, alles in einer Routine packen, oder externe Objekte zu erstellen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Wie am besten eine MessageBox bauen?

Beitrag von Michl »

wp_xyz hat geschrieben:Achtung: der Anchor-Editor ... ist noch relativ instabil und stürzt manchmal ab
Ernsthaft? Seit dem ich mit Lazarus arbeite ist der mir noch nie abgestürzt (oder zumindest kann ich mich nicht daran erinnern). Kannst du das irgendwie eingrenzen (System, bestimmte Einstellungen, etc.)?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten eine MessageBox bauen?

Beitrag von Mathias »

Doppelpost
Zuletzt geändert von Mathias am Do 27. Okt 2016, 19:59, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten eine MessageBox bauen?

Beitrag von Mathias »

Code: Alles auswählen

Goto Zeichnen

Was ist das für ein unschöner Befehl ? :|

Du hättet ja auch alles in einer Routine unterbringen können.

Das hätte man auch machen können, ich wollte in dem Beispiel nur demonstrieren, wie man es mit eine Klasse aufbauen kann.

Nätürlich kann man das auch ohne Klasse lösen.
In der Konsole sieht dies ähnlich aus.

Code: Alles auswählen

procedure TForm1.MB(s: string);
const
  ok = '[ok]';
var
  sa: TStringArray;
  i: integer;
  l, w: integer;
begin
  sa := s.Split(LineEnding);
  l := Canvas.TextWidth(ok);
  for i := 0 to Length(sa) - 1 do begin
    w := Canvas.TextWidth(sa[i]);
    if w > l then begin
      l := w;
    end;
  end;
  Canvas.Rectangle(0, 0, w + 2, (Length(sa) + 2) * Canvas.TextHeight('@') + 2);
  for i := 0 to Length(sa) - 1 do begin
    Canvas.TextOut(1, i * Canvas.TextHeight('@') + 1, sa[i]);
  end;
  Canvas.TextOut((l - Canvas.TextWidth(ok)) div 2 + 1, (Length(sa) + 1) * Canvas.TextHeight('@') + 1, ok);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  MB('Ich' + LineEnding + 'bin' + LineEnding + 'mehrzeilig' + LineEnding + 'und sehr sehr lange');
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten eine MessageBox bauen?

Beitrag von Nixsager »

Mathias hat geschrieben:

Code: Alles auswählen

Goto Zeichnen

Was ist das für ein unschöner Befehl ? :|

Finde ich nicht Wirklich. Es ist nur wichtig, das man die Übersicht nicht verliert. Bessert Ist 'GoSub', das ist ja auch nicht viel anders als würde man 'Procedure' oder 'Function' nutzen.

Aber nochmal.
Wie gesagt was besser ich externe Objekte nutze oder wenn ich jedes mal die Objekte in der Funktion baue.
Ist das nicht der Sinn solcher Objekte, das man sie mehrmals verwenden kann, und der Code damit nicht so aufgebläht wird?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten eine MessageBox bauen?

Beitrag von Mathias »

Bessert Ist 'GoSub', das ist ja auch nicht viel anders als würde man 'Procedure' oder 'Function' nutzen.

Irgendwie erinnert mich das an GW-BASIC, da konnte man nicht anders. :wink:

Wie gesagt was besser ich externe Objekte nutze oder wenn ich jedes mal die Objekte in der Funktion baue.

Wen man etwas mehrmals benutzt ist ein Object/Klasse sicher die bessere Lösung.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten