Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen? (https://www.delphipraxis.net/179220-buttons-zur-laufzeit-erstellen-und-mit-werten-aus-der-datenbank-fuellen.html)

Erutan 20. Feb 2014 20:24

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

stahli 20. Feb 2014 20:51

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?

DeddyH 21. Feb 2014 07:31

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.

Sir Rufo 21. Feb 2014 10:28

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.

stahli 21. Feb 2014 10:32

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...

Erutan 22. Feb 2014 20:27

AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1248937)
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.

Suuuprer Idee!!! Warum bin ich nicht darauf gekommen?

Vielen Dank an alle. Ihr habt mir mal wieder sehr geholfen.

Grüße
Holger

Erutan 24. Feb 2014 02:29

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 05:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz