AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?

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

Ein Thema von Erutan · begonnen am 20. Feb 2014 · letzter Beitrag vom 24. Feb 2014
Antwort Antwort
Erutan

Registriert seit: 16. Mär 2013
71 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 20. Feb 2014, 20:24
Delphi-Version: 7
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
Holger
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.268 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 20. Feb 2014, 20:51
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?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.367 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 21. Feb 2014, 07:31
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 21. Feb 2014, 10:28
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.268 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 21. Feb 2014, 10:32
Ich habe in etwa so etwas wie im Bild verstanden...
Miniaturansicht angehängter Grafiken
zj.png  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (21. Feb 2014 um 10:33 Uhr) Grund: ... mit Bild macht mehr Sinn ;-)
  Mit Zitat antworten Zitat
Erutan

Registriert seit: 16. Mär 2013
71 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 22. Feb 2014, 20:27
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
Holger
  Mit Zitat antworten Zitat
Erutan

Registriert seit: 16. Mär 2013
71 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 24. Feb 2014, 02:29
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
Holger

Geändert von Erutan (24. Feb 2014 um 02:39 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf