![]() |
Sender: TSaveDialog or TOpenDialog
Hi;
Gibt es eine Möglichkeit folgendes Umzusetzten:
Delphi-Quellcode:
Momentan kommt wegen Sender: TSaveDialog or TOpenDialog folgende Fehlermeldung:
procedure Tserver_mainform_form.ExecuteDialog(OnCanClose: TCloseQueryEvent; Sender: TSaveDialog or TOpenDialog);
begin if Sender = TOpenDialog then begin Sender := TOpenDialog.Create(server_mainform_form); Sender.DefaultExt := 'xml'; Sender.Filter := 'XML File / xml|*.xml'; Sender.Title := 'Datei öffnen...'; Sender.OnCanClose := OnCanClose; Sender.Options := [ofHideReadOnly,ofFileMustExist,ofEnableSizing]; Sender.Execute; Sender.Free; end; if Sender = TSaveDialog then begin Sender := TSaveDialog.Create(server_mainform_form); Sender.DefaultExt := 'xml'; Sender.Filter := 'XML File / xml|*.xml'; Sender.Title := 'Speichern unter...'; Sender.OnCanClose := SaveDialog1CanClose; Sender.Options := [ofOverwritePrompt,ofHideReadOnly,ofEnableSizing]; Sender.Execute; Sender.Free; end; end; [Fehler] server_mainform_unit.pas(87): E2029 ';', ')' oder '=' erwartet, aber 'OR' gefunden wie bekomme ich es trotzdem hin??? Es darf nur eine Prozedur sein, nicht 2 [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Sender: TSaveDialog or TOpenDialog
Delphi-Quellcode:
procedure Tserver_mainform_form.ExecuteDialog(OnCanClose: TCloseQueryEvent;Sender: TObject);
begin // sender MUSS schon vor dem Aufruf der Funktion existieren, // und darf nicht erst in der Funktion durch TEtwas.Create(AOwner...) valid gemacht if Sender is TSaveDialog then begin //.... end else if Sender is TOpenDialog then begin //.... end; |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Ist ja eine Frage zu Delphi. |
Re: Sender: TSaveDialog or TOpenDialog
Hallo,
wenn ich das richtig verstehe, möchtest Du in Abhängigkeit eines Parameters einen Open- oder Save-Dialog erstellen und anzeigen. Die sauberste Lösung besteht darin, einen Aufzählungstypen für diesen Parameter zu definieren:
Delphi-Quellcode:
Der Aufruf der Routine könnte dann so aussehen:
type
TDialogType = (dtOpen, dtSave); procedure Tserver_mainform_form.ExecuteDialog(AOnCanClose: TCloseQueryEvent; AType: TDialogType); var lOpenDialog : TOpenDialog; lSaveDialog : TSaveDialog; begin case AType of dtOpen: begin lOpenDialog := TOpenDialog.Create(server_mainform_form); try lOpenDialog.DefaultExt := 'xml'; lOpenDialog.Filter := 'XML File / xml|*.xml'; lOpenDialog.Title := 'Datei öffnen...'; lOpenDialog.OnCanClose := AOnCanClose; lOpenDialog.Options := [ofHideReadOnly,ofFileMustExist,ofEnableSizing]; lOpenDialog.Execute; finally lOpenDialog.Free; end; end; dtSave: begin lSaveDialog := TSaveDialog.Create(server_mainform_form); try lSaveDialog.DefaultExt := 'xml'; lSaveDialog.Filter := 'XML File / xml|*.xml'; lSaveDialog.Title := 'Speichern unter...'; lSaveDialog.OnCanClose := SaveDialog1CanClose; lSaveDialog.Options := [ofOverwritePrompt,ofHideReadOnly,ofEnableSizing]; lSaveDialog.Execute; finally lSaveDialog.Free; end; end; end; // case AType end;
Delphi-Quellcode:
Drei Dinge sind mir noch aufgefallen:
ExecuteDialog (DialogCanClose, dtOpen);
1.) Beim Erzeugen eines Dialogs übergibst Du die Formularvariable als Eigentümer, "Self" oder "Nil" wären hier die bessere Wahl. Eine direkte Verwendung der Formularvariablen als Owner sollte man nach Möglichkeit vermeiden. 2.) Das (boolesche) Ergebnis des Execute-Aufrufs wird von Dir nicht ausgewertet. Wie erfährst Du nun, ob der Benutzer den Dialog abgebrochen oder seine Eingabe bestätigt hat? 3.) Den OnCanClose-Handler für den Open-Dialog möchtest Du als Parameter übergeben, beim Save-Dialog wird ein fester Wert benutzt. Existieren beide Dialog vielleicht schon beim Aufruf der Routine? In diesem Fall wäre das erneute Erzeugen innerhalb der Routine wahrscheinlich überflüssig. :gruebel: Gruß Hawkeye |
Re: Sender: TSaveDialog or TOpenDialog
Danke für eure Umfangreichen Antworten, ihr habt mir sehr weitergeholfen !!!
Gruß Martin |
Re: Sender: TSaveDialog or TOpenDialog
Erst mal Danke für deine Antwort
Zitat:
Zitat:
Aber mal eine andere Frage, du hast ein sehr einheitliches System beim bennennen von Variablen, etc... Gibt es dafür soetwas wie eine Richtlinie? Wenn ja, wo kann man diese nachlesen? Gruß Martin W. |
Re: Sender: TSaveDialog or TOpenDialog
Hi!
Vielleicht hilft dir das weiter: ![]() Ciao Frederic |
Re: Sender: TSaveDialog or TOpenDialog
Perfekt, so waas habe ich gesucht! Danke!
|
Re: Sender: TSaveDialog or TOpenDialog
Hallo Martin,
durch die Übergabe eines Owners legst Du ja den Besitzer der zu erzeugenden Komponente fest. Übergibst Du hier 'Nil', so mußt Du selbst die Komponente freigeben, im anderen Fall übernimmt der Owner die Verantwortung für die Freigabe. Eine ausführliche Erklärung zu den Besitzverhältnissen bei Komponenten findest Du in der Online-Hilfe unter dem Stichwort ![]() Zum Thema "Bennennung von Variablen" hat Dir ja Frederic bereits einen Link genannt. Wenn Du über eine Suchmaschine Informationen zu diesem Thema oder zum Thema "Code-Formatierung" suchst, wirst Du auf sehr viele - auch gegensätzliche - Vorschläge stoßen. Die meisten orientieren sich an den unverbindlichen Vorgaben von Borland, so auch die DP. Lies einige Dokumente und übernimm die Vorschläge, die Dir sinnvoll erscheinen. Weiche dabei nach Möglichkeit nicht allzu weit von vorhandenen Standards ab, das erleichtert später die Zusammenarbeit mit anderen Programmierern in einem Team. Gruß Hawkeye |
Re: Sender: TSaveDialog or TOpenDialog
@ Hawkeye219
Danke dir!!! Ich schreibe momentan an einem kleinen TCP Server... könnte ich hier evt. mal ne Code posten bzw. den Quellcode zum download veröffentlichen damit ich Anregungen bekomme, wie ich den Sourcecode noch sauberer schreiben könnte, welche Fehler ich mache, ob es gut Kommentiert ist, etc... Das ganze sind knapp 600 Zeilen.. aber rund die Hälfe davon sind Kommentare. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz