![]() |
Optionen-Schaltfläche in TOpenDialog
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich weiß, dass dieses Thema hier schon mehrfach behandelt wurde, doch keine Antwort hat mein Problem wirklich gelöst. Ich möchte im Öffnen-Dialog eine Extra-Schaltfläche einbinden, um ein Fenster zu öffnen, in der ich bestimmte Dinge einstellen kann. Dazu habe ich mich in Ableitungen von Komponenten eingearbeitet, bin bisher soweit gekommen, dass die Schalfläche zwar erscheint, ich aber jetzt nicht weit, wie ich auf ihr OnClick-Ereignis reagieren kann. Ich stelle mir vor, dass ich als Ereignis des TOpenOptionsDialog etwas wie ein OnOptionsClick-Ereignis habe, worein ich dann eintragen kann, dass dieses oder jenes Formular angezeigt werden soll. Doch komme ich irgendwie nicht recht weiter. :wall: Bin für jeden Hinweis dankbar. :bounce1: Hier noch der Code der Komponente:
Delphi-Quellcode:
Ich denke, es hat irgendwas mit
unit mOpenOptions;
interface uses Messages, Windows, SysUtils, Classes, Controls, StdCtrls, Graphics, ExtCtrls, Buttons, Dialogs, ExtDlgs, ComCtrls; type TOptionsClick = procedure(Sender: TObject) of object; TOpenOptionsDialog = class(TOpenDialog) private FExtraPanel: TPanel; FOptionsClick: TOptionsClick; FOptionen: TButton; { Private-Deklarationen } protected procedure DoClose; override; procedure DoShow; override; { Protected-Deklarationen } public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function Execute: Boolean; override; { Public-Deklarationen } published property OnOptionsClick: TOptionsClick read FOptionsClick write FOptionsClick; { Published-Deklarationen } end; type TSaveOptionsDialog = class(TOpenOptionsDialog) private { Private-Deklarationen } protected { Protected-Deklarationen } public function Execute: Boolean; override; { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation {$R *.res} uses Consts, Forms, CommDlg, Dlgs; constructor TOpenOptionsDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); FExtraPanel := TPanel.Create(Self); FExtraPanel.Name := 'ExtraPanel'; FExtraPanel.Caption := ''; FExtraPanel.BevelOuter := bvNone; FExtraPanel.BorderWidth := 2; FExtraPanel.TabOrder := 1; FOptionen := TButton.Create(Self); FOptionen.Name := 'BtOptionen'; FOptionen.Caption := 'Optionen...'; FOptionen.Parent := FExtraPanel; FOptionen.SetBounds(195, 0, 75, 24); end; destructor TOpenOptionsDialog.Destroy; begin FOptionen.Free; FExtraPanel.Free; inherited Destroy; end; procedure TOpenOptionsDialog.DoClose; begin inherited DoClose; Application.HideHint; // Hide any hint windows left behind end; procedure TOpenOptionsDialog.DoShow; var SepRect, StaticRect: TRect; begin StaticRect := GetStaticRect; // Set ExtraText area to bottom of static area SepRect.Top := StaticRect.Bottom; SepRect.Bottom := SepRect.Top+30; SepRect.Right := StaticRect.Right; //-6 SepRect.Left := StaticRect.Left; FExtraPanel.ParentWindow := Handle; FExtraPanel.BoundsRect := SepRect; inherited DoShow; end; function TOpenOptionsDialog.Execute: Boolean; begin if NewStyleControls and not (ofOldStyleDialog in Options) then Template := 'EXTDLGTEMPLATE' else Template := nil; Result := inherited Execute; end; function TSaveOptionsDialog.Execute: Boolean; begin if NewStyleControls and not (ofOldStyleDialog in Options) then Template := 'EXTDLGTEMPLATE' else Template := nil; Result := DoExecute(@GetSaveFileName); end; procedure Register; begin RegisterComponents('Moaddin', [TOpenOptionsDialog]); RegisterComponents('Moaddin', [TSaveOptionsDialog]); end; end.
Delphi-Quellcode:
zu tun, weiß aber nicht, wo ich das hinschreiben soll und/oder was zu ergänzen wäre...
FOptionen.OnClick
Zwei weitere, weniger wichtige Probleme, die mich aber schon länger aufgehalten haben, sind folgende: Bei Größen-Änderung des OpenDialog hätte ich gerne, dass die Optionsschaltfläche sich mit nach rechts bewegt(genau unter Öffnen und Abbrechen). Bleibe aber immer wieder daran hängen, dass es weder OnClick noch OnResize-Ereignisse des Dialoges gibt, mit denen ich dies verknüpfen könnte. Zweitens wenn ich meine Komponente anstatt von OpenDialog von OpenPictureDialog ableite, werden meine Modifikationen überhaupt nicht angezeigt. Wirft für mich auch ein weiteres Rätsel auf. :?: :cry: :?: Noch ein Hinweis: ich benutze Delphi 2005 Personal |
Re: Optionen-Schaltfläche in TOpenDialog
Warum weist du deiner Schaltfläche kein Klick-Ereignis zu? :?
|
Re: Optionen-Schaltfläche in TOpenDialog
Erstmal danke für die Antwort..
Kann ja sein dass ich im Moment ein Brett vor dem Kopf habe... Wie sähe denn der genaue Code dazu aus und wo muss der stehen??? Please help me... |
Re: Optionen-Schaltfläche in TOpenDialog
|
Re: Optionen-Schaltfläche in TOpenDialog
Moin Moaddin,
Du hattest ja schon FOptionen.OnClick geschrieben. OnClick ist eine Eigenschaft, wie Caption, der dann noch die entsprechende Methode zugewiesen werden muss. OnClick ist vom Typ TNotifyEvent, also genügt es, wenn Dein OnOptionsClick (und natürlich das Feld FOptionsClick) vom Typ TNotifyEvent sind. Jetzt musst Du Deiner Klasse nur noch eine entsprechene Methode einbauen, z.B.
Delphi-Quellcode:
und FOptionen.OnClick zuweisen.
private
procedure MyOnClick(Sender: TObject); //... Soweit, wenn Du die Methode in Deiner eigenen Klasse haben willst. Willst Du sie von Extern zuweisen, müsstest Du write FOptionClick durch eine Setter-Methode austauschen, in der dann der zugewiesene Wert an die Eigenschaft übergeben wird.
Delphi-Quellcode:
procedure TOpenOptionsDialog.SetClick(const Value: TNotifyEvent);
begin FButton.OnClick := Value; end; |
Re: Optionen-Schaltfläche in TOpenDialog
Hmm... hört sich alles ganz toll an...
Ich komme auch ein Stückchen weiter... Ich kann jetzt beispielsweise
Delphi-Quellcode:
dieses hier schreibe, kann ich genau das machen was in der procedure OptionsClick angegeben ist (hier im Beispiel Caption auf Hallo setzen.). Das ist aber nicht das, was mir eigentlich vorschwebt.
type
TOpenOptionsDialog = class(TOpenDialog) private FOptionsClick: TNotifyEvent; FOptionen: TButton; procedure OptionsClick(Sender: TObject); published property OnOptionsClick: TNotifyEvent read FOptionsClick write FOptionsClick; end; procedure TOpenOptionsDialog.OptionsClick(Sender: TObject); begin FOptionen.Caption := 'Hallo'; end; Da es sich hier um eine Komponente handelt, will ich nachher im eigentlichen Programm selbst bestimmen können, was passiert, wenn ich auf den Button klicke. Der Hinweis mit SetOptionsClick bringt mich auch nicht ganz weiter, da ich hier eine Fehlermeldung bekomme.
Delphi-Quellcode:
[Fehler] mOpenOptions.pas(27): E2168 Feld- oder Methodenbezeichner erwartet
published
property OnOptionsClick: TNotifyEvent read FOptionsClick write SetOptionsClick; procedure TOpenOptionsDialog.SetOptionsClick(const Value: TNotifyEvent); begin FOptionen.OnClick := Value; end; Langsam bin ich echt ratlos. Was mache ich nur falsch? |
Re: Optionen-Schaltfläche in TOpenDialog
Moin Moaddin,
das hier
Delphi-Quellcode:
ist eine Methode der Klasse TOpenOptionsDialog, muss also dort auch eingebunden werden:
procedure TOpenOptionsDialog.SetOptionsClick(const Value: TNotifyEvent);
Delphi-Quellcode:
TOpenOptoinsDialog = class...
private // Felddeklarationen procedure SetOptionsClick(const Value: TNotifyEvent); //.... protected //... public //... |
Re: Optionen-Schaltfläche in TOpenDialog
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Christian,
vielen Dank für deine bisherige Hilfe. Ich habe alle Schritte befolgt, es tut sich jedoch weiterhin nichts. Für mich ist auch keine klare Verknüpfung von dem Button.OnClick und der property zu erkennen. Desweiteren, wenn ich im Objektinspektor auf dieses Ereignis zugreife (OptionsClick) wird diese zwar erzeugt und ich kann auch etwas hineinschreiben, doch im Inspektor wird der Prozedurname nicht, wie üblich bei anderen Ereignissen, angezeigt. Auch wenn ich ihn manuell dort eingebe, leert sich das Feld von alleine. So sieht mein Code jetzt aus (Ausschnittsweise). Sollte es eigentlich so funktionieren oder fehlt da noch etwas?
Delphi-Quellcode:
Viele Grüße
type
TOpenOptionsDialog = class(TOpenDialog) private FOptionsClick: TNotifyEvent; FOptionen: TButton; procedure SetOptionsClick(const Value: TNotifyEvent); published property OnOptionsClick: TNotifyEvent read FOptionsClick write SetOptionsClick; end; procedure TOpenOptionsDialog.SetOptionsClick(const Value: TNotifyEvent); begin FOptionen.OnClick := Value; end; Moaddin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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