Delphi wywołanie procedury z innej formy

0

Witam,
mam program który na głównej formie posiada kilka tabel, i kilka procedur do ich obsługi (odśwież, usuń wiersz...). Na Form3 mam formularz do dodawania/edycji danego wiersza. I tu się zaczyna problem, bo wiersz się dodaje (ale do bazy mysql i jest wszystko ok), a teraz trzeba sprawić żeby tabela na Form1 się "przeładowała". Na Form3 próbowałem:

TabelaAktualizuj(Tabela);
//ale także
Form1.TabelaAktualizuj(Tabela);

Niestety ciągle wyskakuje: Undeclared identifier 'TabelaAktualizuj'
Na formie3 wywołanie tej procedury jest wewnątrz innej, przypisanej do kliknięcia przycisku.
Procedura TabelaAktualizuj znajduje się w części implementation Unit1.

Szukałem na google ale chyba jakoś nieudolnie bo znajdowałem same posty o dodawaniu nowej formy i odwoływaniu z innej...

pozdrawiam
Paweł Lis

0
l153k napisał(a)

Procedura TabelaAktualizuj znajduje się w części implementation Unit1.

Zadeklaruj ją w części interface Unit1.
W Form3 nie zapomnij dodać Unit1 do uses.

0

hmm... nie
a mogę prosić o jakąś podpowiedź jak to zrobić? wstawiłem deklarację TabelaAktualizuj(tabela:TStringGrid); do public, ale wtedy mam:
[Error] Unit1.pas(53): Unsatisfied forward or external declaration: 'TForm1.TabelaAktualizuj'
jak szukałem o używaniu sekcji public to znalazłem Język Delphi (Ctrl+F i "public")
próbowałem wstawić deklarację do interface, ale wtedy mam:
[Error] Unit1.pas(7): Undeclared identifier: 'TStringGrid'
[Error] Unit1.pas(9): Declaration expected but 'USES' found
a dalej cała lista błędów w stylu Undeclared identifier [po kolei wszystko z sekcji type]
Dodam jeszcze że używam Delphi 7 Personal

jak wstawiłem całą procedurę do interface, to też mam błąd:
[Error] Unit1.pas(7): Undeclared identifier: 'TStringGrid'

0
l153k napisał(a)

próbowałem wstawić deklarację do interface

Pokaż kawałek kodu.

0
{$I mysqlinc.inc}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin, uMysqlVio, uMysqlCT,
  uMysqlClient, uMysqlHelpers, Registry, Grids, Unit3;

type
  TForm1 = class(TForm)
    wszystkie obiekty...
    procedure SQLReconnectAndSaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure nowydostawcaClick(Sender: TObject);
    procedure edytujdanedostawcyClick(Sender: TObject);
    procedure dostawcyodswiezClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MySQLClient: TMySQLClient;
  MySQLResult: TMySQLResult;
  Registry: TRegistry;
  ActiveTable: TStringGrid;

implementation

{$R *.dfm}

procedure TabelaAktualizuj(tabela:TStringGrid);
var
  i:integer;
  fields:integer;
begin
  tabela.RowCount:=2;
  tabela.Rows[1].Clear;
  if(assigned(MySQLResult)) then
    begin
      fields:=MySQLResult.FieldsCount;
      while (MySQLResult.Eof<>true) do
        begin
          for i:=0 to fields-1 do
            tabela.Cells[i,tabela.RowCount-1]:=MySQLResult.FieldValue(i);
          MySQLResult.Next;
          tabela.RowCount:=tabela.RowCount+1;
        end;
    end;
end;

tak jest w tej chwili, jak przełożę tą funkcję pod interface to mam błędy jak podane wyżej.
a może jest gdzieś na internecie, albo znacie po prostu przepis, czytaj listę warunków jakie musi spełnić procedura żeby dało się ją używać w każdej formie w delphi 7

0

Zrobiłbym tak:
W sekcji public zadeklarować

procedure TabelaAktualizuj(tabela:TStringGrid);

I następnie w sekcji implementation

procedure TForm1.TabelaAktualizuj(tabela:TStringGrid);

zamiast procedure TabelaAktualizuj(tabela:TStringGrid);


Na Form3 wywoływać w postaci 
```delphi
Form1.TabelaAktualizuj(jakas_tabela);
0

hmm, dalej bez zmian. Delphi domaga się za każdym razem definicji zamiast deklaracji...

0

Coś musisz robić źle, zadeklarowanie procedury w sekcji interface oraz jej defynicji w danej klasie to jest
jedna z banalniejszych i podstawowych w programowaniu w Dephi rzeczy, może musisz poczytać kursy ;/
Zobacz poniżej. Jakoś mi to bez problemów zadziałalo. Różnią się tylko numery formatek, ale to szczegół.

Unit1.pas:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1 : TButton;
    procedure Button1Click(Sender : TObject);
  private
  public
  end;

var
  Form1 : TForm1;

implementation

uses
  Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
begin
  with Form2 do
  begin
    StringGrid1.Visible := True;
    UczSiePodstaw(StringGrid1);
    ShowModal;
  end;
end;

end.

Unit2.pas:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids;

type
  TForm2 = class(TForm)
    StringGrid1 : TStringGrid;
  private
  public
    procedure UczSiePodstaw(SG : TStringGrid);
  end;

var
  Form2 : TForm2;

implementation

{$R *.dfm}

procedure TForm2.UczSiePodstaw(SG : TStringGrid);
begin
  SG.Visible := False;
end;

end.

I wszystko działa prawidłowo, nawet moduł Grids dodaje się do uses, a po pokazaniu Form2,
StringGrid1 oczywiście jest niewidoczny, także nie rozumiem jak można z tym mieć problem.

0
  1. w Unit1 przed:
    implementation
    dodaj:
    procedure TabelaAktualizuj(tabela:TStringGrid);
  2. w Unit2 po:
    implementation
    dodaj:
    uses Unit1;
  3. w Unit2 wywołanie:
    TabelaAktualizuj(ActiveTable);
    lub jeżeli chodzi o tabele na formatce:
    TabelaAktualizuj(Form1.JakasTabela);

1 użytkowników online, w tym zalogowanych: 0, gości: 1