Autor |
Beitrag |
Jakane
Beiträge: 257
|
Verfasst: Fr 25.05.12 14:45
Hallo liebe Delphi-Helfer
Viele reden davon, aber keiner erklärt wie das gehen soll.
Ich habe ein Formular was schon das macht was ich will.
Mein Problem ist das Result.
Beim MessageDLG kann man auf MRYes, MRNo ect prüfen.
Dafür muss man per Schalter einen Result übertragen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TfmHaupt.BBtn1Click(Sender: TObject); begin ShowMessage(FuP_S._Abfragefenster); end;
function TFuP_S._Abfragefenster(): String; begin Application.CreateForm(TFuP_S, FuP_S); end; |
Das Fenster baut sich wie gewünscht auf und ich habe mehrere Schalter auf dem Formular.
Aber wie übergebe ich jetzt das Resultat, welcher Schalter gedrückt wurde, an das ShowMessage?
Hoffe jemand hat eine Idee
Danke im Vorraus
Moderiert von Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Dateizugriff verschoben am Fr 25.05.2012 um 15:55
|
|
DonManfred
Beiträge: 148
Erhaltene Danke: 2
Windows 7
Delphi XE3 Pro + HTML5Builder
|
Verfasst: Fr 25.05.12 14:58
Meinst du vielleicht das?
Delphi-Quelltext 1:
| form1.ModalResult := mrOk |
_________________ Gruss Manfred
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 25.05.12 16:39
Du kannst auch einfach bei den Buttons deren Eigenschaft ModalResult setzen.
Nebenbei gehören Unterstriche in Bezeichnern nicht gerade zu einem guten Programmierstil.
Ein Beispiel findest du im Anhang.
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: Jakane
|
|
dummzeuch
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 27.05.12 12:21
jaenicke hat folgendes geschrieben : |
Nebenbei gehören Unterstriche in Bezeichnern nicht gerade zu einem guten Programmierstil. ;-)
|
Sagt wer?
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 27.05.12 16:13
dummzeuch hat folgendes geschrieben : | jaenicke hat folgendes geschrieben : |
Nebenbei gehören Unterstriche in Bezeichnern nicht gerade zu einem guten Programmierstil.
|
Sagt wer? |
Für die Schreibweise von Delphi-Quelltext gibt es hier einen Styleguide:
dn.embarcadero.com/article/10280 hat folgendes geschrieben: | Naming Conventions
[...]
BAD type names:
ManageLayout // verb phrase
delphi_is_new_to_me // underscores |
Ich zumindest brauche auch deutlich länger, wenn ein Text oder Quelltext statt ganzen Wörtern und Groß- und Kleinschreibung nur einzelne Buchstaben und Unterstriche enthält, um zu verstehen was gemeint ist (und FuP_S versteht man z.B. ohnehin nur in dem Moment, in dem man es schreibt).
(Und zudem finde ich es einfach hässlich und unaufgeräumt in Quelltexten, aber das ist natürlich rein subjektiv.)
Ich zumindest halte mich an die Konventionen und kann die Quelltexte so auch nach Jahren noch sehr gut und schnell lesen. (Und dank Codeformatter auch fremde, aber der entfernt leider Unterstriche und andere Schweinereien nicht.)
Aber die Diskussion auszuweiten, passt wohl nicht ganz hierher. Dass Unterstriche schlechter Stil sind, hielt ich aber aus vergangenen ähnlichen Diskussionen für allgemein akzeptiert... (im Gegensatz zu anderen Sachen)
|
|
Jakane
Beiträge: 257
|
Verfasst: Di 29.05.12 09:05
|
|
Jakane
Beiträge: 257
|
Verfasst: Di 29.05.12 10:01
Dank der kleinen Exe von Jänicke hab ichs raus bekommen
Mit einer Globalen Variablen kann ich beim Schalter drücken den String übergeben:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function TFuP_S._Abfragefenster(...): String; var ... begin // Varriable initialisieren ... // Formular zusammen bauen ... // Schalter setzen ... FuP_S.ShowModal; Result:= AbfrageErgebnis; end;
procedure TFuP_S.SchalterClick(Sender: TObject); var Schalter : String; begin Schalter:= Copy(TButton(Sender).Name, 4, 2); if Schalter = 'OK' then begin AbfrageErgebnis:= 'Bestätige'; end; end; |
Danke für die Hilfe
|
|
Jakane
Beiträge: 257
|
Verfasst: Do 29.08.13 13:20
Hallo liebe Delphi-Helfer
bin mal wieder an meinem eigenen MessageDLG dran und versuch den nun zu optimieren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function TFuP.Abfragefenster(Caption, Ausgangswert : String; Schreibart : TSchreibrecht = SRAlles): String; var FForm : TForm; Text : TJEdit;
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Case Key of VK_Escape: Text.Text:= ''; VK_Return: FForm.Close; end; end; begin FForm:= TForm.Create(Application); Text:= TJEdit.Create(FForm); Text.Parent:= FForm; Text.JSchreibrecht:= Schreibart; Text.Left:= 10; Text.Height:= 20; Text.Top:= 10; Text.Width:= 170; Text.Text:= Ausgangswert; FForm.Caption:= 'Abfrageformular: ' + Caption; FForm.BorderStyle:= bsSingle; FForm.BorderIcons:= [biSystemMenu]; FForm.Position:= poMainFormCenter; FForm.Height:= 70; FForm.Width:= 200; FForm.OnKeyUp:= FormKeyUp; FForm.ShowModal; Result:= Text.Text; end; |
Bei der Bauweise wollte ich von globalen Variablen weg :-/
Bis auf FForm.OnKeyUp funktioniert auch alles: "Fehlermeldung: Inkompatible Typen: Methodenzeiger und reguläre Prozedur"
Weiss einer wie ich das umschreiben muss, damit das so funktioniert?
Danke für Antworten.
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 29.08.13 13:27
|
|
Jakane
Beiträge: 257
|
Verfasst: Do 29.08.13 13:29
Wenn ich das so mache, kennt er FForm nicht, da diese keine globale mehr sein soll :-/
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 29.08.13 13:33
Dann mach doch einfach ein privates Feld draus oder werte den Sender-Parameter aus.
|
|
Jakane
Beiträge: 257
|
Verfasst: Do 29.08.13 13:40
Ich will nicht das die Variablen die ich für den Fensteraufruf brauche die Funktion verlassen.
So wie das Formular definiert ist, ist es für das was ich will richtig.
Nur FormKeyUp macht Probleme.
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 29.08.13 13:46
Dann verlege das Form doch in eine eigene Klasse, am besten in einer eigenen Unit.
|
|
Jakane
Beiträge: 257
|
Verfasst: Do 29.08.13 13:50
Danke...
Ich warte mal noch ob vielleicht jemand anderes eine optimalere Lösung weiss.
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 29.08.13 14:01
Optimaler als ein bequem in der IDE konfigurierbares Formular, dessen Unit man nur einbinden muss? Ich bin gespannt.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 29.08.13 14:28
Jakane hat folgendes geschrieben : | Wenn ich das so mache, kennt er FForm nicht, da diese keine globale mehr sein soll :-/ |
Statt
FForm.Close;
TForm(Sender).Close;
das geht nicht?
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 29.08.13 14:32
Nützt aber nichts, da auch Text in dem Kontext nicht bekannt ist.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 29.08.13 14:45
Eine Variable "Text" zu nennen, ist eh nicht die allerbeste Idee, aber das nur am Rande erwähnt.
|
|
Jakane
Beiträge: 257
|
Verfasst: Mi 11.09.13 14:40
ist warscheinlich mal wieder was ganz kleines, aber ich krieg immer Zugriffsverletzungen beim "FFenster:= TForm.Create(Application);"
Delphi-Quelltext 1: 2: 3: 4:
| procedure TFHaupt.Button1Click(Sender: TObject); begin JTyps.JFenster.JHinweis('Titel', 'Text' + #10 + 'Text2'); end; |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| unit JTyps;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Funktionen_und_Prozeduren, StdCtrls, JEdit;
type TJFenster = class(TPersistent) private JEdit01 : TJEdit; FFenster : TForm; procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); public constructor Create; destructor Destroy; override; published procedure JHinweis(Caption, Nachricht : String; Weite : Integer = 200; Hoehe : Integer = 70); end;
var JFenster : TJFenster;
implementation
constructor TJFenster.Create; begin inherited;
end;
destructor TJFenster.Destroy; begin
inherited; end;
procedure TJFenster.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Case Key of VK_Escape: JEdit01.Text:= ''; VK_Return: FFenster.Close; end; end;
procedure TJFenster.JHinweis(Caption, Nachricht : String; Weite : Integer = 200; Hoehe : Integer = 70); var cMemo : TMemo; begin FFenster:= TForm.Create(Application); cMemo:= TMemo.Create(FFenster); cMemo.Parent:= FFenster; cMemo.Align:= alClient; cMemo.Lines.Text:= #10 + Nachricht; FFenster.Caption:= 'Hinweis: ' + Caption; FFenster.BorderStyle:= bsSingle; FFenster.BorderIcons:= [biSystemMenu]; FFenster.Position:= poMainFormCenter; FFenster.Height:= Hoehe; FFenster.Width:= Weite; FFenster.OnKeyUp:= FormKeyUp; FFenster.ShowModal; FFenster.Free; FFenster:= nil; end;
end. |
Kann mir jemand erklären wie ich das weg bekomme? Danke
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 11.09.13 14:56
Wo wird denn JFenster erzeugt?
|
|