Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi auf komponenten eines zweiten formulars zugreifen (https://www.delphipraxis.net/148320-auf-komponenten-eines-zweiten-formulars-zugreifen.html)

Spanky_Ham 27. Feb 2010 16:38


auf komponenten eines zweiten formulars zugreifen
 
ich habe 2 formblätter und will auf eniem image auf Form1 etwas zeichnen (durch klick eines buttons der sich auf Form2 befindet).

zunächst erstelle ich Form1 mit

Delphi-Quellcode:
Form1 := TForm1.Create(Form2);
Form1.Show;
wenn ich das programm starte sind auch beide fenster sichtbar. wenn ich aber nun eine prozedur aufrufe, die auf Form1.Image1 zeichnen soll, geschieht nichts.
in der projektdatei sind beide units eingebunden. (die standard form, die von anfang an da ist, ist übrigens Form2, danach wurde erst Form1 erstellt).
was muss ich noch machen um auf komponenten anderer formulare zugreifen zu können?

DeddyH 27. Feb 2010 16:41

Re: auf komponenten eines zweiten formulars zugreifen
 
In der Unit von Form2 muss die von Form1 eingebunden sein, dann kannst Du mit Form1.Image1 auf das Image zugreifen.

Spanky_Ham 27. Feb 2010 16:54

Re: auf komponenten eines zweiten formulars zugreifen
 
hab ich schon, es geschieht einfach nichts wenn ich den button drücke :wall:

Jens Hartmann 27. Feb 2010 16:56

Re: auf komponenten eines zweiten formulars zugreifen
 
z.B.
Delphi-Quellcode:
Form2.Button2.Click;
Wenn die Unit in Unit1 eingebunden ist, kannst Du mit dem Namen der Form auf die Unit zugreifen.

DeddyH 27. Feb 2010 16:57

Re: auf komponenten eines zweiten formulars zugreifen
 
Dann musst Du in der 2. Zeile etwas ändern :roll:

Spanky_Ham 27. Feb 2010 23:01

Re: auf komponenten eines zweiten formulars zugreifen
 
die unit ist eingebunden, es gibt auch keine fehlermeldung. die anweisung Form1.Image1... ergibt auch keinen fehler. wenn ich das programm gestartet habe, tut sich jedoch nichts bei dem Image auf form1, wenn ich auf den button auf form2 klicke. muss möglicherweise erst die form1 "freigegeben" werden, sodass man von anderen formularen aus "zugreifen" kann?

ghost007 28. Feb 2010 02:24

Re: auf komponenten eines zweiten formulars zugreifen
 
nein, durch das einbinden sollte alles geregelt sein.

was soll denn passieren, wenn du auf den button klickst?

DeddyH 28. Feb 2010 09:12

Re: auf komponenten eines zweiten formulars zugreifen
 
Zitat:

Zitat von DeddyH
Dann musst Du in der 2. Zeile etwas ändern :roll:

Was im Klartext heißen sollte: zeig mal Deinen Code.

Spanky_Ham 28. Feb 2010 12:43

Re: auf komponenten eines zweiten formulars zugreifen
 
wenn ich auf den button klicke soll auf einem image der anderen form text ausgegeben werden.

meine .dpr sieht so aus:
Delphi-Quellcode:
program test;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form2},
  Unit2 in 'Unit2.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
und das ist der teil meiner Unit1:

Zitat:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit2;

.....

procedure bla(...);
begin
Form1.Image1.Canvas.TextOut(...xyz...);
end;
das war schon alles. die form1 habe ich natürlich durch Form1.Show sichtbar gemacht vorher. hat jemand ne idee was der fehler sein könnte?

DeddyH 28. Feb 2010 15:13

Re: auf komponenten eines zweiten formulars zugreifen
 
Ein Image ist eigentlich nicht dazu gedacht, dass man darauf herumzeichnet. Nimm stattdessen einmal eine PaintBox und zeichne in deren OnPaint-Ereignis, dann sollte das auch klappen.

Spanky_Ham 28. Feb 2010 15:18

Re: auf komponenten eines zweiten formulars zugreifen
 
gezeichnet soll später auch noch werden. wenn jedoch TextOut kein ergebnis bringt, werden es andere funktionen auch nicht tun.
kann mir evtl jemand eine anleitung geben, wie genau man vorgehen muss um eine zweite form richtig einzubinden und auf diese zugreifen zu können?


edit : mit einer paintbox funzt es auch nicht

DeddyH 28. Feb 2010 15:23

Re: auf komponenten eines zweiten formulars zugreifen
 
Zitat:

Zitat von DeddyH
... und zeichne in deren OnPaint-Ereignis, dann sollte das auch klappen.

Es sollte auch mit Invalidate, Refresh oder Repaint nach dem Zeichnen gehen, aber das nur solange, bis das Image neu gezeichnet werden muss, weil z.B. ein anderes Fenster drüber lag.

Luckie 28. Feb 2010 15:29

Re: auf komponenten eines zweiten formulars zugreifen
 
Nimm den Code erst mal aus dem OnKlick-Ereignis der Schaltfläche raus und mach aus ihm eine öffentliche Methode des zweiten Formulares. Diese kannst du dann auch aus dem ersten Formular raus aufrufen. Dann hast du im ersten Formular auch einen aussagekräftigen Methodenaufruf.

Was den Rest angeht, warum es nicht funktioniert, kann man ohne Code nicht sagen. Woher sollen wir wissen, wie dein Code aussieht und was du falsch machst?

DeddyH 28. Feb 2010 15:54

Re: auf komponenten eines zweiten formulars zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Man könnte es auch über eine Property lösen (siehe Anhang).

sx2008 28. Feb 2010 17:10

Re: auf komponenten eines zweiten formulars zugreifen
 
Es wäre ein grosser Fehler, wenn Form2 selbst "persönlich" auf Form1 etwas zeichnet:
Delphi-Quellcode:
procedure TForm2.bla(...);
begin
  Form1.Image1.Canvas.TextOut(...xyz...);
end;
Jedes Formular hat seinen eigenen Verantwortungsbereich und dazu gehört, dass niemand anderes auf dem Formular herumzumalen hat.
Aber Form2 kann das Zeichnen an Form1 delegieren:
Delphi-Quellcode:
procedure TForm2.bla(...);
begin
  Form1.ZeichneRechteckMitBeschriftung(...xyz...);
end;
Das hat folgende Vorteile:
1.) Form1 kann jederzeit geändert werden (z.B. Umbenennung von Komponenten, Austausch von Image1 durch eine Paintbox oder wasauchimmer)
2.) verringerte Abhängigkeiten
3.) es wird expliziert gemacht, was der Code eigentlich tun soll
4.) verbesserte Testbarkeit. Man kann einfach einen Testbutton auf Form1 legen und die Methode
ZeichneRechteckMitBeschriftung() aufrufen. Dann der Code so lange verbessern, bis alles wie gewünscht funktioniert.
Danach dürfte es keine Probleme mehr geben, wenn diese Methode von einem anderen Formular aufgerufen wird.


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