Wie am besten eine MessageBox bauen?
-
- 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?
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.
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!!!
-
- 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?
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)
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);
-
- 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?
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!!!
-
- 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?
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);
Re: Wie am besten eine MessageBox bauen?
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).
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).
-
- 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?
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.
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!!!
Re: Wie am besten eine MessageBox bauen?
Keine Ahnung, was du meinst...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.
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.Nixsager hat geschrieben:
Es geht zwar um ein Konsolen-Programm, aber das Prinzip ist ja das gleich wie bei einem GUI.
-
- 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?
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
Mit Java und C/C++ sehe ich rot
-
- 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?
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
Mit Java und C/C++ sehe ich rot
-
- 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?
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!!!
Re: Wie am besten eine MessageBox bauen?
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.)?wp_xyz hat geschrieben:Achtung: der Anchor-Editor ... ist noch relativ instabil und stürzt manchmal ab
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- 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?
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
Mit Java und C/C++ sehe ich rot
-
- 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?
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
Mit Java und C/C++ sehe ich rot
-
- 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?
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!!!
-
- 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?
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.
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
Mit Java und C/C++ sehe ich rot