Von Form2 auf Form1 zugreifen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Ok, in deinem Beispielcode sollte eigentlich Form1.SQLQuery1 schon richtig sein, um das Entsprechende zu erreichen.

hmmm...

Zu welchem Uses hast du denn die p8_f1 hinzugefügt? Zu dem uses direkt unter "interface"?

Gruß, Euklid

Alfred
Beiträge: 101
Registriert: Do 22. Nov 2007, 20:06
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: München

Beitrag von Alfred »

Hallo Euklid,
Zu dem uses direkt unter "interface"?
Ja.

Was mich stutzig macht, dass Form1.SQLQuery1 in der Form2 in der Datasource1 im Objektinspektor nicht zur Auswahl steht.

Gruß
Alfred

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Ich befürchte, dass ich dir hier wegen fehlender Erfahrung nicht weiterhelfen kann, Sorry.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Die Lösung liegt wo anders.

Im OI werden Komponenten von anderen Formularen nicht zur Auswahl gestellt. Das ist bisher in Lazarus (im unterschied zu Delphi) nicht implementiert.

Du musst das ganze also im OnCreate von Form2 zuweisen (dort bietet es die die Codevervollständigung [ggf. Strg + Space drücken] auch vor):

Code: Alles auswählen

procedure TForm2.FormCreate(Sender: TObject);
begin
//...
Datasource1.Dataset := Form1.SQLQuery1;
//...
Johannes

Alfred
Beiträge: 101
Registriert: Do 22. Nov 2007, 20:06
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: München

Beitrag von Alfred »

Hallo Monta,

vielen Dank. Es funktioniert perfekt. :)

Gruß
Alfred

Kuster Peter
Beiträge: 205
Registriert: So 2. Dez 2007, 20:47
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version
CPU-Target: xxBit
Wohnort: Schweiz

Bei mir geht es nicht

Beitrag von Kuster Peter »

Hallo zusammen

Habe es auch probiert.

In meiner Test Anwendung habe ich Form1 und Form2. Auf Form1 habe ich die Datenbankverbindung zu einer Firebird Datenbank. Läuft perfekt. Auf Form2 will ich ein Grid mit der Verbindung von Form1 machen.

Von Form1 kann man zu Form2 wechseln.

Erstens reklamiert er in Form2, wenn ich in Uses Unit1 habe. Zweitens will er die Ergänzung Datasource im Oncreate auch nicht.

Hier meine Source von Unit 1 und Unit2.

Bin mit meinem Latein am Ende. Weiss jemand Rat?

Unit 1:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  IBConnection, sqldb, db, DBGrids, StdCtrls, Unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    IBConnection1: TIBConnection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.show;
end;
 
initialization
  {$I Unit1.lrs}
 
end.


Unit 2:

unit Unit2;

Code: Alles auswählen

{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, db,
  DBGrids, Unit1;
 
type
 
  { TForm2 }
 
  TForm2 = class(TForm)
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form2: TForm2; 
 
implementation
 
{ TForm2 }
 
procedure TForm2.FormActivate(Sender: TObject);
begin
 
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  Datasource1.Dataset := Form1.SQLQuery1;
end;
 
initialization
     {$I Unit1.lrs}
 
 
end.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Bei mir geht es nicht

Beitrag von Euklid »

Hallo Kuster Peter,
Kuster Peter hat geschrieben: Erstens reklamiert er in Form2, wenn ich in Uses Unit1 habe. Zweitens will er die Ergänzung Datasource im Oncreate auch nicht.

Bin mit meinem Latein am Ende. Weiss jemand Rat?
bei deinem "Erstens" kann ich dir weiterhelfen:

Wenn du in den (oberen) uses-Bereich der unit1 die unit2 schreibst, umgekehrt in den (oberen) uses-Bereich der unit2 die unit1, erzeugst du einen "Kurzschluss" sozusagen. Das Problem kannst du beheben, indem du

1. Im (oberen) uses-Bereich der unit1 die unit2 entfernst,
2. Innerhalb der unit1, direkt unterhalb von "implementation" die Zeile

Code: Alles auswählen

uses unit2;
hinzufügst.

Eventuell erledigt sich damit auch gleich dein zweites Problem, da somit der Kurzschluss beseitigt wurde.

Viele Grüße, Euklid

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Du kannst natürlich nicht beide units voneinander abhängig machen, damit erzeugst du eine zirkuläre Abhängigkeit, die nicht möglich ist.
Entweder unit2/Form2 wurde noch nicht erzeugt, wenn du von unit1/form1 darauf zugreifen willst oder umgekehrt.
Dadurch ist natürlich dein aufruf in Form2.create auch nicht möglich.
ich würde einfach ein Datenmodul erstellen, das die Datenbank-Anbindung kapselt.
Das Datenmodul kann dann in jedem Formular über uses bei Bedarf eingebunden werden.
Bei Bedarf kann ich dir gerne ein (umfangreiches) Beispiel dazu per mail schicken.

Kuster Peter
Beiträge: 205
Registriert: So 2. Dez 2007, 20:47
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version
CPU-Target: xxBit
Wohnort: Schweiz

Lösung:

Beitrag von Kuster Peter »

Vielen herzlichen Dank, es hat geklappt: (20 Jahre xbase und FoxPro haben leider in meinem Kopf ihre Spuren hinterlassen und ich kämpfe mich Schritt für Schritt in die schöne Welt von Lazarus und SQL)

Mit Hilfe von Alfred und Euklid habe ich es geschafft, ein Gemeinschaftswerk:

Lösung:

Code: Alles auswählen

Datasource1.Dataset := Form1.SQLQuery1;
Muss im OnActivate stehen. (Lösung von Alfred)

Der Tipp

Code: Alles auswählen

Uses From2;
Anstatt oben im Uses bei Implementation einzufügen von Euklid war der zweite wichtige Hinweis, der gefehlt hat. Nun läuft es bestens.

Der Tipp von danny61, eine Form zu erstellen, die nicht angezeigt wird und die man als Datenmodul benützt ist bei grossen Projekten die beste Lösung.

Nun läuft es auch bei mir und ich bin happy.

Peter

Antworten