[delphi] jak udostepnic procedure innej formie ?

0

mam procedure:

implementation

uses Unit1, Unit5, Unit27, Unit50, Unit57, Unit55, Unit67;

{$R *.dfm}

procedure UpdateRolls(Bc_Id : String);
  var
    SelectSQL : String;
  Begin
    SelectSQL := 'SELECT COUNT(id) AS total_rolls FROM roll_stock WHERE bc_id = '''+Bc_Id+''';';

    //wywolanie SQL z insertem danych
    Form1.PublicQuery.SQL.Clear;
    Form1.PublicQuery.SQL.Add(SelectSQL);
    Form1.PublicQuery.Active := True;

    //wyjmujemy dane z zapytania i przypisujemy do zmienncyh
    BcEditor.TotalRollsEdit.Text := Form1.PublicQueryDataSource.DataSet.FieldByName('total_rolls').AsString;

    //zamykamy polaczenie i czyscimy
    Form1.PublicQuery.Active := False;
    Form1.PublicQuery.SQL.Clear;
  End;

Ta procedura aktualizuje mi po jakims zdarzeniu ilosc rolek w bazie. Teraz jesli uzywam tej procedury na swojej formie to wszystko jest OK. Ale kiedy stworze inna formatke niech sie nazywa
Form67 I teraz np pod guzik wpisze:
Form51.UpdateRolls(IntToStr(2));
wyskakuje mi taki blad:
Undeclared identifier 'update Rolls'
Mysle sobie pewnie trzeba ta procedure wystawic na zewnatrz zeby byla dostepna moze z sekcji PUBLIC
to wpisuje do public:

procedure UpdateRolls(Bc_Id : String);

To mam teraz taki blad:
[Error] Unit51.pas(85): Unsatisfied forward or external declaration: 'TBcEditor.UpdateRolls'
I nie wiem co to sie dzieje :(

0

Kilka rad: poczytaj o sekcji USES. Następnie: Komponenty bazodanowe trzymaj w DataModule, na koniec: przemyśl strukturę unitów. Wspomniałeś o sekcji public. Poczytaj również o dziedziczeniu (i co powoduje owa sekcja).

Przykład teoretyczny:
Unit A zawiera procedurę pA, której używa unit B.
Czyli:
unit B;
uses A;

Następnie Unit B zawiera procedurę pB, której uzywa unit B,
Czyli:
unit B;
uses A;

Czyli:

A => B;
B => A; a to nam daje

A <=> B. Taka sytuacja daje nam błąd projektowy. Najlepiej globalne funkcje upchać do odddzielnego modułu C i udostępniać go innym. Relacja wówczas będzie następująca

A -> C <- B
     ^
     |
     D
0

Mam taki Unit5 tam wstawiam wszystkie zmienne jakie sa w programie w roznych sekcjach itd wiec tam tez che przepisac procedury to teraz jesli w tym unicie wstawie procedure to jak ja wystqwic na zewnatrz?
zaarz obczaje dziedziczenie.
p.s. jaka roznica jest w uzywaniu datamoduke ? a wstawianiu komponentow na kazda z formatek oddzielnie? znaczy czy to roznica w wygladzie czy w szybkosci dzialania moze ?

0

Definicję funkcji zamień na:

procedure TForm51.UpdateRolls(Bc_Id : String);

0

jak coś ma być widoczne na zewnątrz modułu to musi być zadeklarowane w sekcji INTERFACE. Co do DataModule, patrz post wyżej (tam gdzie masz ABC na schemacie). Założenie jest takie, że masz pięć form i karzda korzysta z tej samej tabeli tylko troszkę inaczej. Po c trzaskać na każdą formę DataConnecton, TQuery, TTable, TDataSource i mieć 5x4, jak można upchać to do DataModule, który jest widoczny dla wszystkich form. Odwołanie się wówczas jest łatwe i przyjemne.

0

No dobra to jest kod

unit Unit1;

interface

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

type
  Ta = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  a: Ta;

implementation

{$R *.dfm}

procedure pokaz(np :string);
Begin
a.Caption := np;
end;

procedure Ta.Button1Click(Sender: TObject);
begin
pokaz('ddd');
end;

end.

Teraz jak utworze druga forme i wniej pod guzik przypisze

a.pokaz('dds');

to co powieniem napisac w tym kodzie zebym mogl wykonac taka operacje bo juz kombinowalem na wsyzstkie sposoby i nic :(

0

musisz do sekcji USES dodac nazwe modulu w ktorym jest
klasa ktorej metody chcesz uzyc!

ZAPAMIETAJ:

jesli chcesz usyc jakiesj
funkcji/procedury/klasy/zmiennej....
w innym Unicie (module) musisz zadeklarowac
to cos w sekcji INTERFACE.

A nastepnie DODAC nazwe tego Unitu (modulu) do sekcji
USES w unicie (module) w ktorym chcesz tego czegos uzywac.

0

Wpisuje do Form1 procedure DO form2 wstawiam button i tez wpisuje nazwe tej procedury z Form1. Kiedy wcisne start to program pyta sie czy dolaczyc do unitu2 do sekcji USES unit1 ? wiec potweirdzam i wtedy wykrywa ze nie widzi funkcji.

Jak powinna wygladac deklaracja procedury w sekcji INTERFACE i gdzie ona sie powinna dokladnie znajdowac? w sekcji Public ? i jak powinna wygladac deklaracja procedury takiej jak:

procedure pokaz(np :string);
 Begin
  Form1.Caption := np;
 end;

w sekcji Public jak wpisze: procedure pokaz(np :string); to wywala blad ten co na poczatku pisalem w pierwszym poscie

0

wiec

1) zaczynasz nowy projekt
2) kladziesz na Form1:
-button1
-button2
-label
3) w obsludze OnClick button1 piszesz
label1.caption := 'DZIALA:-)';
4) w obsludze OnClick button2 piszesz
Form2.show;
5) dodajesz nowy formularz
6) kladziesz na niego
-button1
7) w obsludze OnClick button1 (tego z Form2) piszesz:
Form1.Button1Click(sender);
8) zgadzasz sie na dodanie odpowiedznich wpisow do sekcji uses (pojawi sie pytanie przy pierwszej kompilacji)

tu masz caly kod:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.caption := 'DZIALA:-)';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 form2.show;
end;

end.
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Button1Click(sender);
end;

end.
0

Dzieki uratowany jestem dzieki faktycznie dziala :***

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