![]() |
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ß |
Re: Sender: TSaveDialog or TOpenDialog
Das Posten sollte möglich sein, aber bitte als Attachment, sonst gibt's Ärger mit den Moderatoren. :wink:
Falls es sich um ein vollständiges Projekt handelt, wäre vielleicht die Freeware-Sparte geeigneter. Vielleicht könnte einer der (mitlesenden) Mods dazu was sagen? Gruß Hawkeye |
Re: Sender: TSaveDialog or TOpenDialog
Das werde ich dann wohl als neuen Thread machen :-) Und noch mal ne dumme Frage:
Delphi-Quellcode:
Wie komme ich jetzt innerhalb der an "AOnCanCLose" übergebenen Prozedure an dem Dateiname / Pfad der in dem Dialog eingegeben wurde???
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 := AOnCanClose; lSaveDialog.Options := [ofOverwritePrompt,ofHideReadOnly,ofEnableSizing]; lSaveDialog.Execute; finally lSaveDialog.Free; end; end; end; // case AType end; Gruß |
Re: Sender: TSaveDialog or TOpenDialog
Hi!
Zitat:
Wenns noch kein fertiges Projekt ist, du aber Fragen hast, dann kannst du es ja bei "Sonstige" unterbringen. Ergänzung zu AoCanClose: Diese müsste doch auf den Dialog zugreifen können, oder? Also lSaveDialog.Filename, oder? Ciao Frederic |
Re: Sender: TSaveDialog or TOpenDialog
Auf eine Variable zugreifen, die innerhalb einer anderen Prozedur geschrieben wurde???
|
Re: Sender: TSaveDialog or TOpenDialog
Hi!
Zitat:
Hast du es mal versucht? Ciao Frederic |
Re: Sender: TSaveDialog or TOpenDialog
Property ...??? Was ist dies??? Die Onlinehilfe ist nicht sehr aussagekräftig..
Gruß |
Re: Sender: TSaveDialog or TOpenDialog
Wenn Deine Ereignisbehandlungsroutine aufgerufen wird, erhältst Du im Parameter Sender einen Zeiger auf den Dialog. Durch einen TypeCast kannst Du dann auf alle Eigenschaften des Dialogs zugreifen:
Delphi-Quellcode:
Das funktioniert sogar für TSaveDialog, weil TSaveDialog von TOpenDialog abgeleitet wurde.
procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
begin Dateiname := (Sender AS TOpenDialog).Filename; end; Gruß Hawkeye |
Re: Sender: TSaveDialog or TOpenDialog
Danke.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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