Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Globális változó... 2016 febr. 09 12:24 #1824

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Átnéztem a kódodat és ott a hiba.

Amikor visszatérsz (pl OnClick-ben egy ShowModal hívás után) egy olyan form-ról ami a globális változód értékét módosíthatja a változó értéke nem kerül magától egy másik változóba. Miért is kerülne? Az értékadásokat neked kell elhelyezned a kódban az általad kívánt helyre.

A fordító azt a programot készíti el amit a programozó ír...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Globális változó... 2016 febr. 02 20:46 #1815

  • Julio
  • Julio profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 4
  • Köszönetek: 0
Nem, ennyire amatőr nem vagyok... B)
Jah, és nem használok más változót, amit átvinnék másik unit-ba. Eddig a változókat csak Form-on belül használtam. Csak bővült (bővülne) a program.
De ha nem hisztek nekem, itt a teljes kód:
Form6:
unit kezd;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  DBGrids, Buttons;
 
type
 
  { TForm6 }
 
  TForm6 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    DBGrid1: TDBGrid;
    Label1: TLabel;
    uzi: TLabel;
    procedure BitBtn2Click(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form6: TForm6;
 
implementation
 
uses
  baustelle, munkaadatb, wtbau, epulet;
 
{$R *.lfm}
 
{ TForm6 }
 
procedure TForm6.BitBtn2Click(Sender: TObject);
begin
  Form7.ShowModal;
end;
 
procedure TForm6.DBGrid1CellClick(Column: TColumn);
var
  kiir: string;
begin
  baustell_ID := Form6.DBGrid1.DataSource.DataSet[DBGrid1.Columns[3].FieldName];
  uzi.Caption := IntToStr(baustell_ID);
//  Form1.Label2.Caption := IntToStr(baustell_ID);
  Form4.Label4.Caption:=IntToStr(baustell_ID);
  Form1.ShowModal;
end;
end.
Form1:
unit wtbau;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Menus;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses munkakod, munkafelv, epulet, lekerdez, munkaadatb;
 
 
{$R *.lfm}
 
{ TForm1 }
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.ShowModal;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  application.terminate;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Form3.ShowModal;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  Form4.ShowModal;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  Form5.ShowModal;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2.Caption:=IntToStr(baustell_ID);
end;
end.

Globális változó... 2016 febr. 02 10:45 #1811

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Nézd meg hogy a Form1.ShowModal hívása után is megfelelő-e a baustell_ID értéke...
Lehet, hogy valahol a kódban (pl. Form1.OnShow, Form1.OnActivate vagy egyéb helyen) bennmaradt a baustell_ID "nullázása"? (Azért gondolom, mert nem írtad, hogy más változóval is ilyen baj lett volna.)

Tipp: beszúrási jel az azonosítóra és Ctrl+Shift+I vagy jobb kattintás után a felugró menüben "Keresés / Azonosító használatának megkeresése ..."
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Globális változó... 2016 febr. 01 18:39 #1810

  • Julio
  • Julio profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 4
  • Köszönetek: 0
Először ugye deklarálom (Ezt áttettem az adatbázis-kezelő unit-ba - az eleve mindegyik form-ban uses-olva van. Persze próbáltam előtte a Form6-ban is kezdeni - részletkérdés, hogy Form6 lett az első képernyő..)
var
  DataModule1: TDataModule1;
  baustell_ID: integer;
 
implementation
......
Form6 - a Kezdőlap:
procedure TForm6.DBGrid1CellClick(Column: TColumn);
var
  kiir: string;
begin
  baustell_ID := Form6.DBGrid1.DataSource.DataSet[DBGrid1.Columns[3].FieldName];
  uzi.Caption := IntToStr(baustell_ID);                              //   itt még simán kiírja az eredményt
  Form1.Label2.Caption := IntToStr(baustell_ID);              //   átmenetileg így transzportálom az értéket a következő Form-ba.
  Form1.ShowModal;
end;
És ha a Form1-ben kiíratom baustell_ID értékét - egy Label-lel - az eredmény: 0.

Globális változó... 2016 jan. 31 19:46 #1808

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Légy szíves kivonatolva másold ide a kód vonatkozó részeit (deklarciók) és ahogy ezt csinálod:

cellklikkel kiválasztott cella tartalmát kinyertem

Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Globális változó... 2016 jan. 31 19:19 #1807

  • Julio
  • Julio profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 4
  • Köszönetek: 0
Nincs deklarálva sehol máshol, csak 1 helyen. Azt is próbáltam már itt, ott, teljesen mindegy. Most abban a formban van, ahol ad adatbázisok. Az ugye Uses-olva van eleve minden form-ba.
(Amúgy 20 éve programozok, nálam alap a fontos változóknál az egyedi és megjegyezhető név :) Lazarussal most ismerkedem pár hónapja)

Globális változó... 2016 jan. 31 18:58 #1806

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Nem lehet, hogy több helyen (pl. mindkét unit-ban) deklarálva van ugyanolyan névvel egy-egy globális vagy helyi változó?
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Globális változó... 2016 jan. 31 15:10 #1804

  • Julio
  • Julio profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 4
  • Köszönetek: 0
Üdv.
Tudom, h lerágott csontnak hangzik, de napok óta nem tudom életre kelteni, pedig már sok-sok fórumot olvastam. Igaz, Lazarus kevés van, főleg Delphi...
Szóval. Adott 8 form. Van egy "kezdőlap", ahol cellklikkel kiválasztott cella tartalmát kinyertem. Ezután meghívva másik formot, a változó értéke 0.
Természetesen uses hivatkozások vannak, (a CTRL+Space is látja a változót a másik form-ban is), de próbáltam abszolút hivatkozással is: unit1.valtozó, stb.
Form1: egyszerű értékadás > baustell_ID:=2;
Form2: (uses unit1!) kiíratás: Label.caption:=baustell_ID; >> eredmény 0.
(Ezen a fórumon van egy eljárás, mint a függvényeknél a paraméter átadás - de bevallom, belezavarodtam :blush: )

  • Oldal:
  • 1