AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamischer Verweis auf Komponente

Ein Thema von Moombas · begonnen am 17. Sep 2018 · letzter Beitrag vom 21. Sep 2018
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 09:37
Delphi-Version: 10.2 Tokyo
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 09:39
Dein Programm oder ein fremdes Programm?

Wenn Fall eins: "findcomponent delphi" sollte in der Suchmaschine deiner Wahl weiterhelfen.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 09:48
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
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:04
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:06
@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.

Geändert von Moombas (17. Sep 2018 um 10:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:19
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
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:32
@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.

Geändert von Moombas (17. Sep 2018 um 10:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:39
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.
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
Schokohase
(Gast)

n/a Beiträge
 
#10

AW: Dynamischer Verweis auf Komponente

  Alt 17. Sep 2018, 10:56
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:23 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