Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa definisanjem promenjive

[es] :: Pascal / Delphi / Kylix :: problem sa definisanjem promenjive

[ Pregleda: 1615 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

salvaric
Novi Sad

Član broj: 53995
Poruke: 192
*.dynamic.sbb.rs.



+4 Profil

icon problem sa definisanjem promenjive03.12.2015. u 19:40 - pre 56 meseci
Pozdrav,

u koliko sam preterao sa brojem tema i pitanja nek administrator briše.
Suština je snimiti strukturu zaglavlja iz MySql tabele u promenjivu.
Code:
type
  PHeaderField = record
     Index     : Integer;
     FieldName : String;
     FieldType : TFieldType;
     FieldKind : TFieldKind;
  end;

type
  THederField = array of PHeaderField; 

U glavnoj formi definišem sve promenjive koje su mi potrebne u public, npr.:
Code:
  public
    tab_firme_header  : THederField;
    tab_mesta_header  : THederField;
    tab_racuni_header : THederField;  
    itd...

Potrebnu pormenjivu prosleđujem u Thread na obradu :
Code:

MyThread:= TMyThread.Create(TAB_FIRME,'',tab_firme_header,PConnect); 

MyThread:
Code:
  TMyThread = class(TThread)
      private
        ...
      public
        fHeader    : THederField;  // problematično
        constructor Create(Sender: TObject; Filter: String; nHeader: THederField;
                                    sConn: TConnect );
       ...

constructor TMyThread.Create(Sender: TObject; Filter: String;
  nHeader: THederField; sConn: TConnect);
begin
    ..
    fHeader           := nHeader;    
    ...
end; 
...
procedure TMyThread.Execute;
begin
Synchronize(@OpenTable);   
end; 
...
procedure TMyThread.OpenTable;
begin
    ...
    fHeader:=GetHeaderField(tQ); 
   ...
end;
...

function GetHeaderField(Source: TSQLQuery): THederField;
var
  i : Integer;
begin
      // ucitavanje strukture tabele
      SetLength(Result,Source.FieldCount);
      for i:=0 to Source.FieldCount-1 do
         begin
            Result[i].Index     := i;
            Result[i].FieldName := Source.Fields[i].FieldName;
            Result[i].FieldType := Source.Fields[i].DataType;
            Result[i].FieldKind := Source.Fields[i].FieldKind;
         end;
end; 
 

Mislim da sam dobro prezentovao problem, kad se Thread izvrši promenjiva se ne definiše, proverim je posle, bude prazna.
Code:
fHeader:=GetHeaderField(tQ); 
setuje fHeader kako treba al ga ne vraća u glavni thread odakle je prosleđena
Nikad izvini!
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1327
*.dynamic.sbb.rs.



+307 Profil

icon Re: problem sa definisanjem promenjive03.12.2015. u 20:47 - pre 56 meseci
Nisam radio nikada OOP u Delphi-ju, ali, da li je THederField uopšte klasa?
Čini mi se da šalješ nešto nalik na strukturu - dalje ide po vrednosti a ne po referenci...
Nema veze sa MySql-om osim ako odande nisi uzeo tipove/nasledio, itd...
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 192
*.dynamic.sbb.rs.



+4 Profil

icon Re: problem sa definisanjem promenjive03.12.2015. u 21:02 - pre 56 meseci
Pokušao sam i da napravim THederField kao array od PHeaderField = class itd... al se ne nasleđuje iz thread-a u main form.
Nikad izvini!
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 192
*.dynamic.sbb.rs.



+4 Profil

icon Re: problem sa definisanjem promenjive04.12.2015. u 18:20 - pre 56 meseci
koliko sam provalio da je u ovome problem:
Code:
type
  THederField = array of PHeaderField; 
mada meni prolazi i funkcioniše sve sem kad se ne nasleđuje, samo kad se direktno menjaju promenjive.
Nikad izvini!
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: problem sa definisanjem promenjive05.12.2015. u 15:40 - pre 56 meseci
Reci mi, koja je svrha prihvatanja nHeader: THederField parametra unutar TMyThread.Create() konstruktora?

Vidim da unutra setujes fHeader := nHeader, ali kasnije unutar TMyThread.OpenTable() imas fHeader := GetHeaderField(tQ), gde sad u fHeader upisujes vrednost koju ti vraca GetHeaderField(), cime si prakticno izgubio prethodnu vrednost koju si postavio u konstruktoru (nHeader). Moguce da ima logike iz ugla kompletnog koda (koji nisi postavio), ali iz ovde predstavljenog dela i nisam bas siguran sta si hteo da uradis.

Kako kasnije citas tu vrednost iz thread-a? Pominjes neko nasledjivanje "iz thread-a u main form", na sta pod time mislis? Daj da vidimo i ostatak koda kojim baratas thread-om, a ne samo kreiranje.
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 192
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: problem sa definisanjem promenjive07.12.2015. u 09:20 - pre 56 meseci
Thread ima funkciju otvaranja tabele iz mysql baze i učitavanje u tabelu, a nHeader: THederField je definisanje zaglavlja tabele,svih polja u tabeli, koja mi trebaju radi manipulisanja podataka u mainthread-u, i formira se u thread-u prilikom otvaranja tabele i učitavanja polja iste, i mislio sam da će se promenjiva "tab_firma_header" koja je definisana u mainthread-u i prosleđena u MyThread naslediti promenjivu nHeader. Mogao sam u proceduri u thread-u uraditi na kraji Form1.tab_firma_header := nHeader, i radilo bi kako treba, al je thread univerzalan za sve tabele i morao bih navodit sve promenjive iz mainthread-a.

Vjerovatno sam pomešao babe i žabe, ovo što ja hoću je moguće samo sa objektima tj. klasama, koliko sam mogao da provalim, ali ne sa i sa ovim što ja hoću.

Na isti nači sam prosleđivao i objekat npr. Edit kao TObject, i u thread-u manipulisao sa njim kako treba, al ovo nije izvodljivo.

Problem sam rešio modifikovanjem komponente za prikaz (TStringTreeView), dodao sam dodatna polja, tako da hvala u svakom slučaju.
Nikad izvini!
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: problem sa definisanjem promenjive10.12.2015. u 00:05 - pre 55 meseci
Nema na cemu (bukvalno :P), drago mi je da si resio problem :)

Diskusije radi, cisto da znas da je i to sto si hteo itekako moguce, samo je potreban malo drugaciji pristup. Da bi radilo kako si zeleo, potrebno je uvesti sledece izmene (obrati paznju na koriscenje pokazivaca, i var parametra u konstruktoru, izmene obelezene sa // <<):

Code:

  PHeaderField = ^THederField; // <<

  TMyThread = class(TThread)
       private
         ...
       public
         fHeader    : PHederField; // <<
         constructor Create(Sender: TObject; Filter: String; var nHeader: THederField; // <<
                                     sConn: TConnect );
        ...

 constructor TMyThread.Create(Sender: TObject; Filter: String;
   var nHeader: THederField; sConn: TConnect); // <<
 begin
     ..
     fHeader           := @nHeader; // <<
     ...
 end; 
 ...
 procedure TMyThread.OpenTable;
 begin
     ...
     fHeader^ := GetHeaderField(tQ); // <<
    ...
 end;
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
188.124.211.*



+61 Profil

icon Re: problem sa definisanjem promenjive10.12.2015. u 08:14 - pre 55 meseci
E, ovo nisam znao :).

Uvek mi bilo zao sto u Delphi-ju ne postoji reference tip za non-object varijable (nesto kao "int &a" u C++-u). Ali za ovo resenje (reference varijabla na drugu varijablu) stvarno nisam znao. Covek uci dok je ziv :).
Hvala!

Pozz

P.S. Malo sam prebrzao, nisam pazlivo pogledao kod. Ipak nece da moze to sto sam mislio... steta!
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
87.250.41.*

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: problem sa definisanjem promenjive10.12.2015. u 10:00 - pre 55 meseci
Ne, ne, ipak će da može i to... ;)

Code:
  PInteger = ^Integer;
  ...
  Value: Integer;
  ValuePointer: PInteger;
  ...
  procedure SomeProcedure(var AValue: Integer);
  begin
    ValuePointer := @AValue;
  end;
  ...
  SomeProcedure(Value);
  ...
  ValuePointer^ := 123; // < zapravo dodeljujemo vrednost promenljivoj Value :)

Moze i bez SomeProcedure(), uraditi dodelu negde drugde (direktno), ali sam samo hteo da naglasim da ako se promenljiva prinosi nekoj metodi, onda mora da ide i "var", kako bi prenos bio po adresi, a ne po vrednosti (kako bi onda unutar metode adresu vezali za pokazivac).

p.s. Cak i dokumentacija kao prvi primer navodi pokazivac na integer -- http://docwiki.embarcadero.com...ters_and_Pointer_Types_(Delphi)

[Ovu poruku je menjao ((BugA)) dana 10.12.2015. u 12:22 GMT+1]
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 192
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: problem sa definisanjem promenjive10.12.2015. u 10:40 - pre 55 meseci
Hvala ((BugA)) care,

eksperimentisat ću posle kad mi ponovo zatreba nešto slično, neda mi se sad prepravljati kod, kad već fercera alternativa.
Nikad izvini!
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
188.124.211.*



+61 Profil

icon Re: problem sa definisanjem promenjive11.12.2015. u 11:42 - pre 55 meseci
Citat:
((BugA)):
Ne, ne, ipak će da može i to... ;)

Code:
  PInteger = ^Integer;
  ...
  Value: Integer;
  ValuePointer: PInteger;
  ...
  procedure SomeProcedure(var AValue: Integer);
  begin
    ValuePointer := @AValue;
  end;
  ...
  SomeProcedure(Value);
  ...
  ValuePointer^ := 123; // < zapravo dodeljujemo vrednost promenljivoj Value :)

Moze i bez SomeProcedure(), uraditi dodelu negde drugde (direktno), ali sam samo hteo da naglasim da ako se promenljiva prinosi nekoj metodi, onda mora da ide i "var", kako bi prenos bio po adresi, a ne po vrednosti (kako bi onda unutar metode adresu vezali za pokazivac).

p.s. Cak i dokumentacija kao prvi primer navodi pokazivac na integer -- http://docwiki.embarcadero.com...ters_and_Pointer_Types_(Delphi)

[Ovu poruku je menjao ((BugA)) dana 10.12.2015. u 12:22 GMT+1]


Hehe, ovo nije nista novo, ali nije TO poenta. Ideja je da imam DVE reference istog tipa koje gadjaju na istu varijablu u memoriji. U C++ moze, u D jok.
Osim, ako se neko seca starog TurboPascala, imao je sluzbenu rec 'absolute'; mogao si da napucas dve varijable da ciljaju istu memoriju; cak nisu morale da budu ni istog tipa. Ali to je prilicno krut mehanizam, radio je samo prilikom deklarisanja promenljivih.

Pozz
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: problem sa definisanjem promenjive12.12.2015. u 17:13 - pre 55 meseci
Aha, ti si bas mislio na formu (referenca, a ne pokazivac), ja sam objasnjavao sustinu (jedna promenljiva zapravo pokazuje na drugu)... Pazi, absolute i dalje postoji i u Delphi-ju ;) E sad, sto kazes da je krut mehanizam, nisam nesto mnogo radio u C++, ali zar nije i tamo jedino moguce dodeliti referencu prilikom deklaracije?

I druga stvar me interesuje, sta ti najvise nedostaje u Delphi-ju, u poredjenju reference i pokazivaca? Koliko sam ja shvatio, taj mehanizam u C++ je prilicno ogranicen u odnosu na pokazivace (i cesto je u pozadini implementiran upravo kroz pokazivacku logiku), i izgleda mi kao da je jedina prednost sto ne moras "rucno" da dereferenciras pokazivac, nego to referenca podrazumeva, pa je kod mozda malo pregledniji... ili vise "beginner friendly" :) To jeste steta sto ne postoji u Delphi-ju iz ugla "elegantnosti" koda, ali mislim da nije nikakvo ogranicenje u bilo kakvom radu.

Da, Delphi ima reference za objekte (TObject, kao najpoznatiji primer), koje pritom jesu dosta "popustljivije" u smislu da referencu mozes da dodelis/menjas kad hoces, ali mislim da nema za proste tipove. Bas gledam da nadjem nesto, ali izgleda je absolute nesto najpribliznije... Vala si me sad zainteresovao :D
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: problem sa definisanjem promenjive

[ Pregleda: 1615 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.