Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DELPHI przekazywanie zmiennych między formami

gienek861 04 Cze 2010 22:06 4030 11
  • #1 04 Cze 2010 22:06
    gienek861
    Poziom 8  

    Witam wszystkich. Tworzę właśnie program i napotkałem problem, którego sam rozwiązać nie mogę, mimo iż naprawdę przejrzałem wiele pozycji.
    Otóż w Form4 mam zmienna s:integer, która przyjmuje rozne wartosci w zaleznosci od zaznaczenia opcji w RadioGroup. Chcę aby wartosc s bylo mozna wykorzystac w Form5 np. W Form4 s bedzie mialo wartosc 10, to chce aby po przejsciu do Form5 i zaznaczeniu tam np pierwszej opcji RadioGroup, s powiekszylo sie o kolejne 10, czyli powinno być ostatecznie po dwoch ywborach s=20. Probowalem roznych sposobow, ale najlepszy to chyba z deklaracja zmiennych w sekcji public, ale ni jak mi to niewychodzi. Proszę o rady, jak mam to zapisac w obu formularzach.

    Z gory dziękuje za cenne wskazowki i pozdrawiam ;)

    0 11
  • #2 05 Cze 2010 00:48
    beluosus
    Poziom 25  

    Wystarczy napisać zwyczajne odwołanie do obiektu, np:

    Code:
        Button1.Caption := Form3.text; // text to string w sekcji public
    
        CheckBox1.Checked := Form3.CheckBox1.Checked;

    I klepnąć F9, wtedy Delphi powinien sam zaproponować dodanie Form3 (Unit3) do uses:
    Code:
    implementation
    

    uses Unit2, Unit3;

    {$R *.dfm}

    0
  • #3 05 Cze 2010 10:11
    gienek861
    Poziom 8  

    Dalej nie do końca rozumiem. Mój kod wygląda w skrócie tak:
    Form4

    Cytat:
    type
    TForm4 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Memo1: TMemo;
    Image2: TImage;
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    s: integer;
    end;

    var
    Form4: TForm4;
    implementation

    uses Unit5;

    {$R *.dfm}

    procedure TForm4.RadioGroup1Click(Sender: TObject);
    begin
    case RadioGroup1.ItemIndex of
    0: begin
    Memo1.Show;
    Memo1.Text:='wskazniki';
    end;
    1: begin
    Memo1.Show;
    Memo1.Text:='Wskaźniki 2';
    end;
    2: begin
    Memo1.Text:='Analiza ';
    end;
    end;
    end;
    procedure TForm4.Button1Click(Sender: TObject);
    begin
    s:=0;
    if RadioGroup1.ItemIndex=0 then
    s:=s+10 and Form5.showmodal
    else if RadioGroup1.ItemIndex=1 then
    s:=s+20
    else if RadioGroup1.ItemIndex=2 then
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    end;
    end.


    Form5:
    Cytat:
    type
    TForm5 = class(TForm)
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    Image1: TImage;
    Label2: TLabel;
    Image2: TImage;
    procedure RadioGroup1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form5: TForm5;
    s1: integer;
    implementation

    uses Unit4;

    {$R *.dfm}



    procedure TForm5.RadioGroup1Click(Sender: TObject);
    begin
    case RadioGroup1.ItemIndex of
    0: begin
    Memo1.Show;
    Memo1.Text:='wskazniki';
    end;
    1: begin
    Memo1.Show;
    Memo1.Text:='Wskaźniki 2';
    end;
    2: begin
    Memo1.Text:='Analiza ';
    end;
    end;
    begin
    if RadioGroup1.ItemIndex=0 then
    s1:=s1+10
    else if RadioGroup1.ItemIndex=1 then
    s1:=s1+20
    else if RadioGroup1.ItemIndex=2 then
    s1:=s1+30
    else if RadioGroup1.ItemIndex=3 then
    s1:=s1+40;
    end;
    end;
    end.

    0
  • #4 05 Cze 2010 10:25
    excray
    Poziom 39  

    Code:
    if RadioGroup1.ItemIndex=0 then
    
    s:=s+10 and Form5.showmodal
    else if RadioGroup1.ItemIndex=1 then
    s:=s+20
    else if RadioGroup1.ItemIndex=2 then
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    end;

    ???
    A nie powinno być:
    Code:
    if RadioGroup1.ItemIndex=0 then
    
    begin
      s:=s+10;
      Form5.showmodal;
    end
    else if RadioGroup1.ItemIndex=1 then
    s:=s+20
    else if RadioGroup1.ItemIndex=2 then
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    end;

    0
  • #5 05 Cze 2010 10:33
    gienek861
    Poziom 8  

    Tak, to racja. To powinno tak wyglądać. Ale dalej wartość zmiennej s z Form4 nie przechodzi do Form5. Jak to zrobić?

    0
  • #6 05 Cze 2010 10:34
    excray
    Poziom 39  

    W zasadzie powinno używać się zmiennych globalnych ale możesz zrobić w następujący sposó. Do form5 dodajesz jakiś label np label21 i we właściwościach ustawiasz jego niewidoczność i teraz w Form 4 końcówkę zmieniasz:

    Code:
    else if RadioGroup1.ItemIndex=2 then
    
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    Form5.Label21.Caption:=IntToStr(s);
    end;
    end.


    a później w form5 bierzesz dane z label21. Nie jest to do końca poprawny sposób ale cóż...

    0
  • #7 05 Cze 2010 10:36
    gienek861
    Poziom 8  

    No najlepiej jakbym użył zmiennych globalnych, bo będę miał kilkanaście formularzy i na każdym musiałbym stosować ten "trik".

    0
  • #8 05 Cze 2010 10:40
    excray
    Poziom 39  

    No dobrze, ale w Form5 nie używasz s tylko s1. A jak wpiszesz w kodzie form5 zmienną s to co się dzieje? Nie przenosi danych z Form4?

    Code:
    begin
    
    if RadioGroup1.ItemIndex=0 then
    begin
      s1:=s1+10;
      s:=s+10;
    end;

    ?

    0
  • #9 05 Cze 2010 10:44
    gienek861
    Poziom 8  

    jak ustawię zmienną globalną w Form4 w sekcji public s: integer i używam jej potem w Form5 to nie przenosi jej wartości. Rozwiązanie wyżej nic nie wnosi, bo nie mogę przenieść tych wartości s czy s1 z Form4 do Form5 :/
    Albo może po prostu zle definuje zmienna globalną s. Moglby ktos podpowiedziec jak to nalezy zrobic?

    0
  • #10 05 Cze 2010 18:31
    gienek861
    Poziom 8  

    excray napisał:
    W zasadzie powinno używać się zmiennych globalnych ale możesz zrobić w następujący sposó. Do form5 dodajesz jakiś label np label21 i we właściwościach ustawiasz jego niewidoczność i teraz w Form 4 końcówkę zmieniasz:
    Code:
    else if RadioGroup1.ItemIndex=2 then
    
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    Form5.Label21.Caption:=IntToStr(s);
    end;
    end.


    a później w form5 bierzesz dane z label21. Nie jest to do końca poprawny sposób ale cóż...


    Może tak spróbuję, ale jak wziąść z labela wartosc zeby mozna nią dalej operowac (tj. dodawac do niej kolejne liczby)? Bo w labelu zapisujemy chyba tylko tekst jak sie nie mylę. strtoint(label1)? cos takiego???

    0
  • #11 05 Cze 2010 20:44
    lanky
    Poziom 17  

    Cytat:

    ale jak wziąść z labela wartosc zeby mozna nią dalej operowac (tj. dodawac do niej kolejne liczby)? Bo w labelu zapisujemy chyba tylko tekst jak sie nie mylę. strtoint(label1)? cos takiego???


    w labelu siedzi string jak chcesz go wyciągnąć i zamienić na liczbę to konwertujesz go w ten sposób:
    Code:

    var
    i: integer;
    begin
    i:= StrToInt(Label1.Caption); // String do integera
    end;

    A jak chcesz teraz dodać jakąś liczbę do tego to
    Code:

    i:= i+5; // doda do zmiennej i liczbę 5

    i teraz z powrotem możemy wsadzić tą liczbę do labela.
    Code:

    Label1.Caption:= IntToStr(i);   // integer do stringa

    0
  • #12 06 Cze 2010 00:23
    gienek861
    Poziom 8  

    excray napisał:
    W zasadzie powinno używać się zmiennych globalnych ale możesz zrobić w następujący sposó. Do form5 dodajesz jakiś label np label21 i we właściwościach ustawiasz jego niewidoczność i teraz w Form 4 końcówkę zmieniasz:
    Code:
    else if RadioGroup1.ItemIndex=2 then
    
    s:=s+30
    else if RadioGroup1.ItemIndex=3 then
    s:=s+40;
    Form5.Label21.Caption:=IntToStr(s);
    end;
    end.


    a później w form5 bierzesz dane z label21. Nie jest to do końca poprawny sposób ale cóż...


    Zrobilem wlasnie tak i nastepnie odczytalem wartosc z tegolabela w Form5 i uzywalem dalej - licznenie punktów dziala :D Wielkie dzieki za pomoc!!!

    0