[ salvaric @ 03.12.2015. 19:40 ] @
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
[ dusans @ 03.12.2015. 20:47 ] @
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...
[ salvaric @ 03.12.2015. 21:02 ] @
Pokušao sam i da napravim THederField kao array od PHeaderField = class itd... al se ne nasleđuje iz thread-a u main form.
[ salvaric @ 04.12.2015. 18:20 ] @
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.
[ ((BugA)) @ 05.12.2015. 15:40 ] @
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.
[ salvaric @ 07.12.2015. 09:20 ] @
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.
[ ((BugA)) @ 10.12.2015. 00:05 ] @
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;
[ Rapaic Rajko @ 10.12.2015. 08:14 ] @
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!
[ ((BugA)) @ 10.12.2015. 10:00 ] @
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]
[ salvaric @ 10.12.2015. 10:40 ] @
Hvala ((BugA)) care,

eksperimentisat ću posle kad mi ponovo zatreba nešto slično, neda mi se sad prepravljati kod, kad već fercera alternativa.
[ Rapaic Rajko @ 11.12.2015. 11:42 ] @
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
[ ((BugA)) @ 12.12.2015. 17:13 ] @
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