Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FindComponent Frage (https://www.delphipraxis.net/2237-findcomponent-frage.html)

hitzi 14. Jan 2003 11:39


FindComponent Frage
 
Warum funktioniert der folgenden Code nicht. Es wird immer assigned(tf) als false erkannt, obwohl das Fenster mit dem Namen existiert.
Gibt es einen anderen Weg, herauszufinden ob eine Fenster mit einem bestimmten Namen schon existiert? (nur Fenster aus dem eigenen Programm)

Delphi-Quellcode:
var tf:TForm2;
begin
 tf:=Application.FindComponent('test')as TForm2;
 if assigned(tf)=false then begin  //Form2 mit dem Namen Test wurde nicht gefunden
     whith TForm2.create(self) do begin
      name:='test';
      ....
     end
   end else begin //Form2 mit dem Namen Test wurde gefunden
    whith (Application.FindComponent('test')as TForm2) do begin
      ....
    end;
 end;
MfG Hitzi

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

hitzi 14. Jan 2003 11:52

Fehler gefunden.

self muss in application geändert werden beim create.

MfG Hitzi

jbg 14. Jan 2003 11:55

Erst denken, dann posten.

hitzi 14. Jan 2003 12:36

Zitat:

Zitat von jbg
Erst denken, dann posten.

[OFFTOPIC]

?

Zu dem Zeitpunkt als ich hier gepostet wusste ich keine Lösung zu dem Problem. Hatte schon vieles probiert. Da wollte ich mal hier im Forum nachfragen. Wenn ich nachfrage heißt das doch nicht, dass ich aufhöre mit der Problemlösung. Wenn ich dann eine Lösung finde (egal auf welchen Weg) und hier noch niemand auf meine Frage geantwortet hat, ist doch eigentlich selbstverständlich, dass man die Lösung präsentiert.

Eine Alternative wäre den Post zu löschen. Diese Möglichkeit habe ich aber nicht. Außerdem hat evt. später einmal ein anderer User das selbe Problem und wird so mit der Forumsuche fündig.

Also, was soll ich das nächste Mal machen? Meine Frage posten, allerdings mit der Gefahr, dass ich mit der Zeit selber eine Lösung finde. Oder lieber gar nicht erst posten?

MfG Hitzi

RomanK 14. Jan 2003 12:50

[OT]
Also wenn du ein Prob hast dann darfst du immer hier posten, wenn du dann die Lösung findest oder selber herrasubekommst dann poste diesen Lösungsweg bitte, wie gesagt es kann ja sein das ein andere User dass selbe Prob auch mal hatte, und es nicht rausbekommen hat, oder dass es einer haben wird, bzw. es einfach jemanden interessiert wie es geht...[/OT]

grayfox 23. Jan 2003 16:57

hallo hitzi!
Zitat:

self muss in application geändert werden beim create.
verrätst mir auch noch, worauf 'self' geändert gehört?

mfg, gf

hitzi 23. Jan 2003 20:02

Auszug:
whith TForm2.create(self) do begin

ändern in
whith TForm2.create(application) do begin

So siehts dann aus:
Delphi-Quellcode:
var tf:TForm2;
begin
tf:=Application.FindComponent('test')as TForm2;
if assigned(tf)=false then begin  //Form2 mit dem Namen Test wurde nicht gefunden
     whith TForm2.create(application) do begin
      name:='test';
      ....
     end
   end else begin //Form2 mit dem Namen Test wurde gefunden
    whith (Application.FindComponent('test')as TForm2) do begin
      ....
    end;
end;
MfG Hitzi

Christian Seehase 23. Jan 2003 21:19

Moin Hitzi,

noch ein kleiner Tip:

Frage bei einem boolschen Vergleich niemals nach true oder false ab.

Beispiel:

Delphi-Quellcode:
if Assigned(tf) = false then // sollte man nicht machen

if not Assigned(tf) then // besser so
True und false sind zwar in Delphi als Konstanten definiert (true = 1, false = 0), aber es ist nicht gesagt, dass ein boolsches Funktionsergebnis sich unbedingt daran hält.
Meist wird <> 0 als true und = 0 als false angesehen.
(Ok, in diesem Beispiel ist die Wahrscheinlichkeit das es schiefgeht natürlich gering).
Für meinen Geschmack ist die zweite Variante auch lesbarer.

Udo 23. Jan 2003 22:56

Delphi-Quellcode:
tf:= Application.FindComponent('test') as TForm2;
So was ist schlecht. Wenn etwas gefunden wird was test heisst aber nicht vom Type TForm ist fliegt die das um die Ohren.
Besser:
Delphi-Quellcode:
var C: TComponent;
begin
   C:= TForm(Application.FindComponent('test'));
   if C = nil then
   begin
     Application.CreateForm(TForm, Form2);
     Form2.Name:= 'test';
     Form2.Show;
   end
   else
     if C is TForm then
       with C as TForm do Height:= 300;
end;
:dancer:

hitzi 24. Jan 2003 14:43

Danke für die Tipps. :D Werde den Quellcode dem entsprechend abändern.

MfG Hitzi

grayfox 24. Jan 2003 21:54

@hitzi!
sorry, ich hatte dein posting nicht richtig verstanden, sonst hätte ich nicht nochmal gefragt. auf die uhrzeit kann ich mich auch nicht ausreden (17:57), vielleicht sollte ich mich doch um eine brille umsehen :D

mfg, stefan

MoDHellwalker 22. Jun 2003 13:31

ich hab noch en problem mit findcomponent.
ich hab folgendes geschrieben:
Delphi-Quellcode:
procedure TForm1.Button11Click(Sender: TObject);
var i: integer;
begin
if edit15.text='' then
begin
for i:=6 to 10 do
begin
If (FindComponent('label'+IntToStr(i)) as TLabel).caption='1' then
 If (FindComponent('label'+IntToStr(i)) as TLabel).caption='2' then
  if (FindComponent('label'+IntToStr(i)) as TLabel).caption='3' then
   if (FindComponent('label'+IntToStr(i)) as TLabel).caption='4' then
   begin
    disable;
    Button1.Enabled:=true;
    editnummer.Text:='0';
    Edit15.Text:='30';
   end;
  end;
 end;
end;
es funktioniert aba irgendwie net. kann mir einer sagen was da falsch is?

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Christian Seehase 22. Jun 2003 13:37

Moin Hellwalker,

zum Einen:
Was funktioniert nicht?

zum Anderen:
Wenn Du Dir eine Variable deklarierst, Typ TLabel, und FindComponent immer dieser zuordnest, musst Du nur einmal zu Beginn jedes Schleifendurchlaufes FindComponent aufrufen, und kannst ansonsten mit der Variablen arbeiten.

MoDHellwalker 22. Jun 2003 13:43

ich hab jetzt mal den labels die caption 1 bis 4 gegeben. wenn ich jetzt aber auf de button klicke passiert eben nich was passieren soll. er macht nämlich gar nix. was is da der fehler?

Christian Seehase 22. Jun 2003 13:46

Moin Hellwalker,

ich seh's gerade:
Es kann auch nichts passieren, denn so wie Du abfragst muss die Caption gleich 1, gleich 2, gleich 3 und gleich 4 sein.
Die Verwendung von else könnte helfen.

MoDHellwalker 22. Jun 2003 13:55

aba so wie es da steht muss es doch net des gleiche label sein oder???
is soll ja entweder label6, 7, 8, 9 oder label10 sein. was muss ich dann ändern?

Christian Seehase 23. Jun 2003 12:02

Moin Hellwalker,

so wie es da steht ist es immer das gleiche Label, da ja immer IntToStr(i) zum Namen hinzugefügt wird.
Könntest Du mal kurz erklären, was Du mit der Abfrage bezweckst?
Es klingt so, als würde sich das nicht mit einer Schleife lösen lassen können (zumindest nicht mit so einer).

THE MATRIX 27. Jul 2003 15:05

Re: FindComponent Frage
 
Probier es doch mal so:

Delphi-Quellcode:
if TLabel(FindComponent('Label' + IntToStr(I))).Caption = '1' then blablabla....


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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