Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Dynamischer Verweis auf Komponente (https://www.delphipraxis.net/197899-dynamischer-verweis-auf-komponente.html)

Moombas 17. Sep 2018 09:37

Delphi-Version: 10.2 Tokyo

Dynamischer Verweis auf Komponente
 
Moin zusammen,

dies ist ggf. eine blöde Frage aber ich komme da einfach nicht weiter:

Wie kann ich Dynamisch auf eine Komponente zugreifen?
Beispiel: Ich habe Buttons, deren Namen auf einer Logik basieren (einfachstes Beispiel hierfür wäre: "Name1", "Name2",...) bzw. auch deren Funktion.
Nun möchte ich nicht für jeden Button einzeln eine Funktion schreiben, sondern würde dies gerne ableiten.
Beispiel2:

Button1:
ShellExecute(Handle, 'open', PChar(Tool1E.text), PChar(Tool1P.Text), nil, SW_SHOW);
Button2:
ShellExecute(Handle, 'open', PChar(Tool2E.text), PChar(Tool2P.Text), nil, SW_SHOW);

besser wäre die "1" (bzw. die "2") aus dem Button-Namen zu ziehen (kein Problem) und dadurch den dyn. Verweis (PChar(Tool1E.text)) zu generieren (keine Ahnung wie).

Kann mir hierbei jemand weiter helfen, ich finde nur dynamische Erzeugung von Buttons etc. aber kein dynamischer Verweis.

TiGü 17. Sep 2018 09:39

AW: Dynamischer Verweis auf Komponente
 
Dein Programm oder ein fremdes Programm?

Wenn Fall eins: "findcomponent delphi" sollte in der Suchmaschine deiner Wahl weiterhelfen.

Schokohase 17. Sep 2018 09:48

AW: Dynamischer Verweis auf Komponente
 
Und ein Frame würde da nicht gehen?

Dort hättest du einen Button und zwei TextBoxen und der code im ButtonClick sähe dann so aus
Delphi-Quellcode:
ShellExecute(Handle, 'open', PChar(Tool1E.text), PChar(Tool1P.Text), nil, SW_SHOW);
In der Form erzeugst du nun einfach x-mal den Frame und bist fertig.

Uwe Raabe 17. Sep 2018 10:04

AW: Dynamischer Verweis auf Komponente
 
Vielleicht suchst du ja die Methode Delphi-Referenz durchsuchenFindComponent?
Delphi-Quellcode:
procedure TForm325.Button1Click(Sender: TObject);
var
  btn: TButton;
  edtE: TEdit;
  edtP: TEdit;
  idx: Integer;
begin
  btn := Sender as TButton;
  idx := ExtractButtonNumber(btn.Name);
  edtE := FindComponent(Format('Tool%dE', [idx])) as TEdit;
  edtP := FindComponent(Format('Tool%dP', [idx])) as TEdit;
  ShellExecute(Handle, 'open', PChar(edtE.text), PChar(edtP.Text), nil, SW_SHOW);
end;

Moombas 17. Sep 2018 10:06

AW: Dynamischer Verweis auf Komponente
 
@TiGü: Es sind Komponenten innerhalb meines Programms, jedoch in einer TPageControl. Wenn ich nun also deinem Tipp nachgehe bekomme ich folgendes als "Lösungsansatz":

TEdit(FindComponent('Tool' + copy(Name, 5, 1) + 'E')).Text

Leider ist, wenn ich mir das mal als Showmessage zur Kontrolle ausgeben lasse, immer leer. Der Name wird jedoch korrekt zusammengesetzt.
Delphi-Quellcode:
procedure TTools.Tool1BClick(Sender: TObject);
begin
  with sender as TButton do
  begin
    showmessage(TEdit(FindComponent('Tool' + copy(Name, 5, 1) + 'E')).Text); //nur zum Testen das Showmessage, hier kommt später die Shellexecute rein
  end;
  // ShellExecute(Handle, 'open', PChar(Tool1E.text), PChar(Tool1P.Text), nil, SW_SHOW);
end;
@Schokohase: Ich verstehe aktuell nicht wie du es meinst, da dein Beispiel wie eine 1:1 Kopie meines geposteten Textes aussieht. Es sind insgesamt 15 Buttons, die wiederum auf jeweils 2*15 Edit-Felder zugreifen für das Shellexecute.

@Uwe Raabe: Die Funktion habe ich auf TiGü's Hinweis hin gefunden, scheint aber irgendwie nicht 100%ig zu funktionieren (s.o.). Und die Funktion "ExtractButtonNumber" ist mir und Delphi nicht bekannt.

Uwe Raabe 17. Sep 2018 10:19

AW: Dynamischer Verweis auf Komponente
 
Zitat:

Zitat von Moombas (Beitrag 1413342)
Die Funktion habe ich auf TiGü's Hinweis hin gefunden, scheint aber irgendwie nicht 100%ig zu funktionieren (s.o.). Und die Funktion "ExtractButtonNumber" ist mir und Delphi nicht bekannt.

Die Funktion ExtractButtonNumber ist nur ein Platzhalter auf Grund deiner Angabe
Zitat:

Zitat von Moombas (Beitrag 1413336)
besser wäre die "1" (bzw. die "2") aus dem Button-Namen zu ziehen (kein Problem)

aus der ich schließen kann, daß du das irgendwie hinbekommst.

Wenn FindComponent nicht funktioniert, wäre das jetzt der richtige Zeitpunkt für ein kleines Testprojekt, bei dem das nicht funktioniert.

Schokohase 17. Sep 2018 10:24

AW: Dynamischer Verweis auf Komponente
 
Nun ja, einfach so:
Delphi-Quellcode:
unit uStartFrame;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFrame1 = class(TFrame)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

uses
  Winapi.ShellAPI;

{$R *.dfm}

procedure TFrame1.Button1Click(Sender: TObject);
begin
  ShellExecute( Handle, 'open', PChar(Edit1.Text), PChar(Edit2.Text), nil, SW_SHOW );
end;

end.
und in der Form dann
Delphi-Quellcode:
unit uMainForm;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
 
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  uStartFrame;

type
  TForm1 = class( TForm )
    Frame11: TFrame1;
    Frame12: TFrame1;
    Frame13: TFrame1;
    Frame14: TFrame1;
    Frame15: TFrame1;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

Moombas 17. Sep 2018 10:32

AW: Dynamischer Verweis auf Komponente
 
@Uwe Raabe:

Achso XD Das mit der Button Nummer bekomme ich so hin:
Delphi-Quellcode:
procedure TTools.Tool1BClick(Sender: TObject);
begin
  with sender as TButton do
  begin
    try
      StrToInt(copy(Name, 6, 1));
      showmessage('Tool' + copy(Name, 5, 2) + 'E'); //zur Prüfung des korrekt generierten Namens - passt
      showmessage(TEdit(FindComponent('Tool' + copy(Name, 5, 2) + 'E')).Text); //zur Prüfung des korrekten übergebenen Inhalts - leer!?
    except
      showmessage('Tool' + copy(Name, 5, 1) + 'E'); //zur Prüfung des korrekt generierten Namens - passt
      showmessage(TEdit(FindComponent('Tool' + copy(Name, 5, 1) + 'E')).Text); //zur Prüfung des korrekten übergebenen Inhalts - leer!?
    end;
  end;
//  ShellExecute(Handle, 'open', PChar(Tool1E.text), PChar(Tool1P.Text), nil, SW_SHOW);
end;
Die Showmessage werden dann natürlich durch shellexecute abgelöst, wenn hier der richtige Wert raus kommt.
Das mit dem "nicht funktionierendem Beispiel" muss ich schauen, da mein Programm mittlerweile 4170 Zeilen hat, wo auch Daten drin sind, die nicht für die Öffentlichkeit bestimmt sind müsste ich dafür ein Beispiel bauen.

Ich habe dies aber auch mal mit einem Edit-Feld getestet, welches nicht in einer TPageControl eingebettet ist und auch dort funktioniert es leider nicht.
Er scheint die Komponente nicht zu finden.

@Schokohase: Die Editfelder befinden sich nicht im gleichen Menüpunkt meiner TPageControl wie die Buttons und zudem würde ich auch dort wieder mehrere Funktionen schreiben anstatt einer (dynamischen) Funktion.

DeddyH 17. Sep 2018 10:39

AW: Dynamischer Verweis auf Komponente
 
Wenn TTools kein Formular ist, sondern irgendein Client-Control davon, wäre vielleicht FindControl statt FindComponent der bessere Ansatz. FindComponent sucht nach Komponenten, deren Owner die aufrufende Klasse ist, FindControl nach Controls, deren Parent sie ist. Bei zur Designtime hinzugefügten Komponenten ist der Owner normalerweise das Formular, vermutlich geht es deshalb nicht.

Schokohase 17. Sep 2018 10:56

AW: Dynamischer Verweis auf Komponente
 
Also würdest du so etwas brauchen
Delphi-Quellcode:
unit uStartFrame;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFrame1 = class(TFrame)
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { Private-Deklarationen }
  public
    procedure Execute();
  end;

implementation

uses
  Winapi.ShellAPI;

{$R *.dfm}

procedure TFrame1.Execute;
begin
  ShellExecute( Handle, 'open', PChar(Edit1.Text), PChar(Edit2.Text), nil, SW_SHOW );
end;

end.
Und für den Button
Delphi-Quellcode:
procedure TFormX.Button1_Click(Sender:TObject);
begin
  Frame1.Execute;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 1 von 3  1 23      

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