Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Sender: TSaveDialog or TOpenDialog (https://www.delphipraxis.net/67531-sender-tsavedialog-topendialog.html)

Martin W 16. Apr 2006 07:20


Sender: TSaveDialog or TOpenDialog
 
Hi;

Gibt es eine Möglichkeit folgendes Umzusetzten:
Delphi-Quellcode:
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;
Momentan kommt wegen Sender: TSaveDialog or TOpenDialog folgende Fehlermeldung:

[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]

sniper_w 16. Apr 2006 07:47

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 16. Apr 2006 07:49

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Ist ja eine Frage zu Delphi.

Hawkeye219 16. Apr 2006 09:31

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:
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;
Der Aufruf der Routine könnte dann so aussehen:

Delphi-Quellcode:
ExecuteDialog (DialogCanClose, dtOpen);
Drei Dinge sind mir noch aufgefallen:

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

Martin W 16. Apr 2006 15:47

Re: Sender: TSaveDialog or TOpenDialog
 
Danke für eure Umfangreichen Antworten, ihr habt mir sehr weitergeholfen !!!

Gruß
Martin

Martin W 16. Apr 2006 16:09

Re: Sender: TSaveDialog or TOpenDialog
 
Erst mal Danke für deine Antwort

Zitat:

Zitat von Hawkeye219
1.) Beim Erzeugen eines Dialogs übergibst Du die Formularvariable als Eigentümer, "Self" oder "Nil" wären hier d
die bessere Wahl. Eine direkte Verwendung der Formularvariablen als Owner sollte man nach Möglichkeit vermeiden.

Soll ich dies auch machen wenn ich Fenster erzeuge??? Immer Owner "self" oder "nil" lassen? Welche Auswirkungen hat dies?

Zitat:

Zitat von Hawkeye219
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:

Das war ein Versehen, sollte nicht sein...

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.

fkerber 16. Apr 2006 16:12

Re: Sender: TSaveDialog or TOpenDialog
 
Hi!

Vielleicht hilft dir das weiter:
http://community.borland.com/soapbox...,10280,00.html


Ciao Frederic

Martin W 16. Apr 2006 16:22

Re: Sender: TSaveDialog or TOpenDialog
 
Perfekt, so waas habe ich gesucht! Danke!

Hawkeye219 16. Apr 2006 16:37

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 Delphi-Referenz durchsuchenTComponent.Owner.

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

Martin W 16. Apr 2006 16:43

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.
Seite 1 von 2  1 2      

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