![]() |
Delphi-Version: 7
Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Hallo zusammen,
ich hatte bis vor einigen Wochen mit Hilfe dieses Forums eine kleine Anwendung geschrieben, die mir das Eintragen von Pressemitteilungen in Online-Presseportale erleichtert. Das Kernstück besteht aus einem TWebbrowser in dem die Seiten mit den HTML-Formularen aufgerufen werden und einem Button-Panel auf dem die Buttons zu den einzelnen Presseportalen sind. Das Ganze ist mir nun aber zu unflexibel geworden. Wenn ich ei neues Presseportal hinzufügen will, muß ich den Sourcecode editieren und das Programm neu kompilieren. Nun bin ich dabei, mir eine separate Eingabemaske für alle relavanten Daten zu den Presseportalen zurecht zu basteln in die ich Name, URL, Namen der Inputfelder etc. eintragen kann. Daie Date werden als typisierter Rekord aus einer Flatfile-Datenbank verwaltet. Was jetzt der Hammer wäre, wäre die Möglichkeit, die einzelnen Buttons (siehe oben) erst zur Laufzeit zu erstellen, d.h. in der Datenbank nachzuschauen, wie viele Datensätze vorliegen, für jeden Datensatz einen Button zu generieren und alle relevanten Daten für diesen Button aus der Datenbank zu ziehen. Nur....wie plane ich ein onclick-Ereignis für einen Button, der vor Programmstart noch gar nicht vorhanden ist? Außerdem weiß ich noch nicht wie ich auf die eizelnen gezielten Einzeldaten des Rekords zugreifen kann. Ich brauche ja nicht immer den gesamten Datensatz als starres Gebide, sondern immer nur einzelne Daten daraus. Grüße Holger |
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Du könntest jedem Button.Tag einen Indexwert zuweisen (Index aller Einträge) und Tag in der OnClick-Behandlung auswerten und den entsprechenden Datensatz suchen.
Das könnte eine einfache Lösung sein, wenn auch nicht die genialste. Hilft das weiter? |
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Man kann dem Button.Tag aber auch mittels Cast ein Objekt zuweisen. Allerdings weiß ich nicht, wie das unter 64 Bit aussieht, wenn Tag da nur 32-bittig ist, kann das danebengehen.
Delphi-Quellcode:
unit DynaButtons;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs; type (* Beispieldaten, die einem Button zugeordnet werden *) TDatensatz = class private FStringValue: string; FIntValue: integer; public property StringValue: string read FStringValue write FStringValue; property IntValue: integer read FIntValue write FIntValue; end; TfrmDynamicButtons = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } (* Liste für die dynamischen Buttons *) FButtons: TObjectList; (* Hilfsroutine zum Erzeugen eines neuen Buttons *) procedure InsertButton(const ACaption: string; X, Y: integer; Datensatz: TDatensatz); (* Eventhandler für OnClick der dynamischen Buttons *) procedure ShowData(Sender: TObject); public { Public-Deklarationen } end; var frmDynamicButtons: TfrmDynamicButtons; implementation {$R *.dfm} procedure TfrmDynamicButtons.FormCreate(Sender: TObject); var Datensatz: TDatensatz; begin (* Erzeugen der Liste *) FButtons := TObjectList.Create(false); (* Und mit ein paar Daten befüllen *) Datensatz := TDatensatz.Create; Datensatz.StringValue := 'Hanswurst'; Datensatz.IntValue := 100; InsertButton('Erster Button', 10, 10, Datensatz); Datensatz := TDatensatz.Create; Datensatz.StringValue := 'Hallo Welt'; Datensatz.IntValue := 12345; InsertButton('Zweiter Button', 10, 40, Datensatz); Datensatz := TDatensatz.Create; Datensatz.StringValue := 'Dideldum, Dideldei'; Datensatz.IntValue := 42; InsertButton('Dritter Button', 10, 70, Datensatz); end; procedure TfrmDynamicButtons.FormDestroy(Sender: TObject); var i: integer; Datensatz: TDatensatz; Button: TButton; begin (* Liste durchgehen und zugeordnete Daten freigeben *) for i := 0 to FButtons.Count - 1 do begin Button := FButtons[i] as TButton; Datensatz := TDatensatz(Button.Tag); Datensatz.Free; end; (* Die Liste selbst nicht vergessen *) FButtons.Free; end; procedure TfrmDynamicButtons.InsertButton(const ACaption: string; X, Y: integer; Datensatz: TDatensatz); var Button: TButton; begin (* Erzeugen eines neuen Buttons *) Button := TButton.Create(self); Button.Left := X; Button.Top := Y; Button.Parent := self; Button.OnClick := ShowData; Button.Caption := ACaption; (* und Zuordnen des Datensatzes *) Button.Tag := integer(Datensatz); (* Ab in die Liste damit *) FButtons.Add(Button); end; procedure TfrmDynamicButtons.ShowData(Sender: TObject); var Datensatz: TDatensatz; Button: TButton; begin (* Anzeigen der zugeordneten Werte *) if (Sender is TButton) then begin Button := TButton(Sender); if (FButtons.IndexOf(Button) > -1) then begin Datensatz := TDatensatz(Button.Tag); if Assigned(Datensatz) then ShowMessage(Format('Stringwert: %s; Zahlwert: %d', [Datensatz.StringValue, Datensatz.IntValue])); end; end; end; end. |
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Du hast also einen Button, der dir eine Pressemitteilung auf einem Portal einträgt.
Gut. Wenn du jetzt mehrere Portale hast, dann stell diese Portale doch in einer Liste zur Verfügung, wo du dann entweder das Portal einzeln auswählen oder auch eine Mehrfachauswahl hast. Du hast dann immer nur noch einen Button, weil es auch ein Aktionswunsch ist, der sich dann aber auf mehrere Ziele (Portale) oder nur ein einzelnes Ziel (Portal) auswirkt. Die Idee mit den dynamischen Buttons ist (wie du selber schon bemerkt hast) irgendwie ... und immer wenn es sich so anfühlt, dann ist diese Umsetzung erst mal als schlecht zu bewerten. |
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe in etwa so etwas wie im Bild verstanden...
|
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Zitat:
Vielen Dank an alle. Ihr habt mir mal wieder sehr geholfen. Grüße Holger |
AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
Jetzt zum zweiten Teil meiner Frage.
An dieser Stelle kam eine ziemlich kompliziert und umständlich ausgedrückte Frage nach einem Zeiger für typisierte Daten. Ich hab's aber jetzt gelöscht weil ich dann doch lieber ini-Dateien verwende. Damit kenne ich mich wenigstens einigermaßen aus. Hätte das Posting ganz gelösvht, geht aber leider nicht. Sorry |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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