Ustalanie wartości zmiennej w OnCreate.

0

Witam!
W jaki sposób mogę ustawić wartość zmiennej już w OnCreate formy?

 
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='dsa';
end;
begin
ShowMessage(Edit1.Text);
end.

Przy takie kodzie pokazuje błąd:
[Error] Unit1.pas(33): Undeclared identifier: 'Edit1'

 
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Edit1: TEdit;////////////////////////////////////////ZMIANA!
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='dsa';
end;
begin
ShowMessage(Edit1.Text);
end.

A tak wartość Edit1.text podczas wyświetlania w ShowMessage(); jest równa NULL.

Pozdrawiam!

0
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Text := 'anytext';
 ShowMessage(Edit1.Text);
end;

end.

U mnie działa. Jakie masz Delphi ?

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Text := 'anytext';
end;

begin
 ShowMessage(Edit1.Text);
end.

W tem sposób nie powinno się wywoływać.

var
  Form1: TForm1;
  Edit1: TEdit;////////////////////////////////////////ZMIANA!

Za taką deklarację mógłbym cię zabić, ale dostałbym bana...Nie deklaruj nigdy w ten sposób !
No, wyżyłem się. Powinno działać (heh, wiem, zawszę tak piszę, a i tak przeważnie nie działa).

0

W przypadku 1 sposobu działa, ale funkcja ShowMessage(); jest wywoływana również w OnCreate, a tego nie chcemy;)
W przypadku drugiego sposobu nie działa, "[Error] Unit1.pas(32): Undeclared identifier: 'Edit1'".
Pozdrawiam!
Chcę móc używać tej zmiennej w głównej części programu.

0

Chcesz madac zmiennej wartość w OnCreate to dajesz
ZmiennaTypuString := 'Wartość'; Oczywiście zmienna
musi być zadeklarowana najlepiej w sekcji privare lub
public jeżeli ma być widziana poza modułem. A jeżeli
nie chcesz w OnCreate MessageBox'a - to go tam nie
umieszczaj. Bo też nie wiem - z czym masz problem.

0
olesio napisał(a)

Chcesz madac zmiennej wartość w OnCreate to dajesz
ZmiennaTypuString := 'Wartość'; Oczywiście zmienna
musi być zadeklarowana najlepiej w sekcji privare lub
public jeżeli ma być widziana poza modułem. A jeżeli
nie chcesz w OnCreate MessageBox'a - to go tam nie
umieszczaj. Bo też nie wiem - z czym masz problem.

No właśnie w tym problem, że jakoś tak nie działa(pewnie robię coś źle;O).
Jeżeli zadeklaruję ją w taki sposób:

type
  TError = class(TForm)
    procedure FormCreate(Sender: TObject);
  private

  public
  id:string;
  end; 

To nie jest widziana w głównej części programu.
Gdy zrobię to tak:

 
type
  TError = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  id:string;

To pomimo, że nadam jej wartość w OnCreate, to w głównej części programu ma wartość NULL.
Pozdrawiam!

0
Gr0sZ napisał(a)

To nie jest widziana w głównej części programu.

Co Ty nazywasz główną częścią programu? Czy nie myślisz przypadkiem, że w Delphi jest podobnie jak w Pascalu, gdzie jest główny blok programu zawarty między słowami begin ... end, a przed tym blokiem deklaruje się funkcje. Wskazywałby na to ten fragment kodu:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text:='dsa';
end;
begin
  ShowMessage(Edit1.Text);
end.

W Delphi nie ma czegoś takiego jak część główna programu. Działanie programu opiera się na zdarzeniach, więc nie można stwierdzić w jakiej kolejności będą się wykonywały poszczególne procedury, bo to zależy od użytkownika.

Co do problemu, to działa zarówno pierwszy, jak i drugi sposób.

unit Unit1;
...
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    p: string;
  public
  end;

var
  Form1: TForm1;
  s: string;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  s:= 'Jak nie działa, ';
  p:= 'jak działa';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:= s + p;
end;

procedure MojaProcedura;  // Zauważ brak TForm1
begin
  // Widzisz różnicę w odwołaniu się do Label1
  // oraz zmiennych s i p
  Form1.Label1.Caption:= s + Form1.p;
end;

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

end.
0
simplex napisał(a)

W Delphi nie ma czegoś takiego jak część główna programu. Działanie programu opiera się na zdarzeniach, więc nie można stwierdzić w jakiej kolejności będą się wykonywały poszczególne procedury, bo to zależy od użytkownika.

Co Ty powiesz? A plik projektu dpr to co? Czy każdy program w Delphi musi być aplikacją okienkową?

Jest jeszcze coś takiego jak initialization (i jego przeciwieństwo finalization), które wykonuje się podczas ładowania modułu. Jeżeli to moduł formularza to nawet przed OnCreate ale tam nie odwołasz się do komponentów VCL (tego formularza) bo one jak i sam formularz jeszcze nie istnieją.

EDIT//
a jeżeli napiszesz w jakimś module:

begin
   //Tu jakiś kod tylko nie odwolujacy sie do formularza i jego komponetow
   ShowMessage('Witam');
end.

to będzie to samo co wspomniane initialization

0

Nie wiem czy pytającemu nie chodzi o coś takiego jak poniżej.
Jednak w przypadku aplikacji VCL takie rozwiązanie - jak tutaj
pokazuje - jest takie sobie, lepiej wszystko zrobić w OnCreate
bo jeżeli masz komunkat o nieznanym identyfikatorze to chyba
pomyliłeś jego nazwę, a jeżeli jest zadeklarowane i nazwa jest
ok, to najpewniej chcesz użyć zmiennej z sekcji public/private
poza klasą wtedy trzeba użyć nazwt klasy przez zmienną, ale
to są podstawy jak takie rzeczy sprawiają trudnośc, to radzę
poczytac jakiś kurs Delphi, bo takie banały trzeba ogarnąć, a
i widze że putający jest na forum nie od dzisiaj to powinien z
pewnością wiedzieć, że od pytań o banały jest dzial NEWBIE!

/...
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;
  Zmienna : string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := Zmienna;
end;

begin
  Zmienna := 'Ucz się podstaw';
  ShowMessage(Zmienna);
end.
0
olesio napisał(a)

Nie wiem czy pytającemu nie chodzi o coś takiego jak poniżej.
Jednak w przypadku aplikacji VCL takie rozwiązanie - jak tutaj
pokazuje - jest takie sobie, lepiej wszystko zrobić w OnCreate
bo jeżeli masz komunkat o nieznanym identyfikatorze to chyba
pomyliłeś jego nazwę, a jeżeli jest zadeklarowane i nazwa jest
ok, to najpewniej chcesz użyć zmiennej z sekcji public/private
poza klasą wtedy trzeba użyć nazwt klasy przez zmienną, ale
to są podstawy jak takie rzeczy sprawiają trudnośc, to radzę
poczytac jakiś kurs Delphi, bo takie banały trzeba ogarnąć, a
i widze że putający jest na forum nie od dzisiaj to powinien z
pewnością wiedzieć, że od pytań o banały jest dzial NEWBIE!

/...
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;
  Zmienna : string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := Zmienna;
end;

begin
  Zmienna := 'Ucz się podstaw';
  ShowMessage(Zmienna);
end.

Ojojojoj, chyba nadal nie rozumiesz z czym mam problem.
Nie bardzo wiem co chciałeś pokazać w tym przykładnie. Zadeklarowałeś zmienną globalną, a po między begin i end. przypisałeś wartość i ją wyświetliłeś.W każdym razie sam go rozwiązałem.
Całość programu umieściłem w procedurze OnCreate.
Pisałem już kilka razy w dziale "newbie", ale bardzo ciężko otrzymać tam sensowną odpowiedź z uwagi na to, że zaglądają tam głównie newbie.
Pozdrawiam!

0

No ja jestem newbie i zaglądam do tego działu, jak i inni zainteresowani.
Jak problem rozwiązałeś to dobrze. Tylko właśnie tak wklejałeś kod i swój
problem opisywałeś, że ciężko się było zorientować z czym masz problem.

0
olesio napisał(a)

No ja jestem newbie i zaglądam do tego działu, jak i inni zainteresowani.
Jak problem rozwiązałeś to dobrze. Tylko właśnie tak wklejałeś kod i swój
problem opisywałeś, że ciężko się było zorientować z czym masz problem.

A mógłbyś mi powiedzieć, czy takie rozwiązanie jest poprawne?
Pozdrawiam!

0

Ale teraz nie wiem na które mam patrzeć, wkleiłeś dwa różne kody i
chyba też fragmenty później. Jeżeli działa tak jak chcesz - to znaczy
że pewnie jest ok. Jeżeli nie ma błędu kompilatora, wyjątku AV a i w
MessageBoxie czy tam gdzie chcesz pokazuje, to co ma się pokazać,
to pewnie wszystko jest ok. Zresztą jak zrozumialem, już ogarnąłeś.

0

Witam, znowu ja:)
Napisałem, że mój problem został rozwiązany ponieważ moja aplikacja działała prawidłowo, ale po raz kolejny natrafiam na takim sam problem i nie chcę już uciekać do wrzucania wszystkiego w OnCreate...
Więc tak, tak nie działa:

 
var
  Form1: TForm1;
  text:string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
text:='dsadasda';
end;

begin
Form1.Button1.Caption:= text;
end.

natomiast tak działa:

var
  Form1: TForm1;
  text:string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
text:='dsadasda';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Button1.Caption:= text;
end;

end. 

Czy mógłby ktoś wyjaśnić mi dlaczego? Z mojego punktu widzenia jest to nielogiczne:/
Pozdrawiam!

0

juz Ci ktos napisal... co to ma byc za konstrukcja w ogole?
pierwszy raz widze cos takiego:

procedure TForm1.FormCreate(Sender: TObject);
begin
text:='dsadasda';
end;

begin //do czego to nalezy ???????
Form1.Button1.Caption:= text;
end.

delphi to nie pascal pod dosa.
wbij sobie do glowy ze: w delphi kazdy blok begin..end musi nalezec do jakiejs procedury/funkcji i nie moze wisiec "w powietrzu".
jedynym wyjatkiem jest plik samego projektu (Project>View source). operacje tam zawarte moga byc wykonane jeszcze przed OnCreate.
swoja droga az dziwie sie ze Delphi takie cudo kompiluje.
wez czlowieku naucz sie podstaw bo takie rzeczy idiotyczne wymyslasz ze brak slow.

poza tym... Forma ma cos takiego jak "Text", staraj sie unikac takich nazw zmiennych.
skad wiesz czy piszac Text:='ppp'; przypisesz ppp do zmiennej "text" a nie do "Form1.Text"?

jeszcze jedno... formatuj kod! jak piszesz program to musisz robic wciecia (uzywajac <tab> i spacji), kazdy programista Ci to powie.
a reszte Twoich pytan umieszczaj w dziale Newbie, bo widze ze z podstawami u Ciebie cienko.

0

Nie chce mi się czytać tego całego bo wydaje mi się to niezrozumiałe.

Zamiast ustalać w OnCreate wartość Text dla TEdit, dlaczego nie zrobisz tego na poziomie Delphi przez ObjectInspektora?
Jeśli wartość Text zmienia się podczas startu programu, to jej przypisanie wykonaj w OnShow lub w OnActivate.

0

A wiesz co się wykona wcześniej - blok begin end czy utworzenie obiektu? Co to za popaprana szkoła, żeby mieszać obiekty z begin end unitu?? Kto ci tak pokazał - wskaż go na - ukamienujemy go.
Poczytaj PODSTAWY, co to jest klasa/metoda/właściwość/zmienna, poczytaj co to jest zasięg zmiennej i jak to wygląda. Nie masz podstaw, nie rozumiesz jak działa to co piszesz i próbujesz na siłę dorobić filozofię to własnych błędów

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