Autor Téma: Ulozenie rukovete TStrings  (Přečteno 1956 krát)

Offline wwlado

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
Ulozenie rukovete TStrings
« kdy: 05-04-2020, 00:18:48 »
Dobry den.

Potreboval by som poradit. Mam jeden editor (synEditor) v ktorom by som chcel editovat viacere subory. Mám vytvorenu databázu z dynamickych premennych, ktore obsahuju premennu TStrings.
Textové subory sa nacitavaju do databázy zo suboru:
 (Este dodam, ze Atom je bunka databazy. Atom^.List : TStrings; MyEdit je hlavny edit typu SynEdit)
Kód: [Vybrat]
      {$I-}
      Assign  (f, A+'SaveOpenFiles.txt');
      Reset   (f);
      While Not Eof(f) Do
       Begin
        ReadLn(f, S);
        If FileExists(S) Then
         Begin
          aWrite(ExtractFileName(S), atLiblary, False, paUnit);
          If cAtom<>Nil then
           Begin
            cAtom^.Str := S;
            if cAtom^.List=Nil Then cAtom^.List:= TStringList.Create;
            cAtom^.List.LoadFromFile(S);  <----- Tu sa nacitavju subory
            cAtom^.Hide:= False;
           End;
         End;
       End;
      Close   (f);
      If IOResult<>0 Then Result:='Read error. Can not load List file!'
                     Else Result:='List file is loadded.';
      {$I+}

Prepinanie Editacie jednotlivych textov:
Kód: [Vybrat]

   If uAtom<>Nil Then                 
     Begin
      MyEdit.Lines:= uAtom^.List;   <--- Vlozenie Textu z DB do Editu
      uTabName    := uAtom^.Name;
      uFileName   := uAtom^.Str;
     End;

Myslel som, ze sa takym sposobom predava iba adresa komponentu (TStrings). A texty v databaze sa daju takymto sposobom editovat. No pri editacii sa mi text v databaze nemeni.
Aky je postup aby som adresu TStrings z Editu (MyEdit.Lines) nasmeroval na uAtom^.List. Aby Editor pouzival TStrings ktory je ulozeny v databaze.

Offline wwlado

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
Re:Ulozenie rukovete TStrings
« Odpověď #1 kdy: 05-04-2020, 08:54:31 »

Offline wwlado

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
Re:Ulozenie rukovete TStrings
« Odpověď #2 kdy: 05-04-2020, 13:30:18 »
Nakoniec som to len zmenil strategiu na kopirovanie textu pomocou funkcie Assign a takto to funguje.
Kód: [Vybrat]
// --- Zmena ---
  If uAtom<>Nil Then uAtom^.List.Assign(MyEdit.Lines);
 TabInfo;
 if uAtom<>Nil Then
  Begin
   // -- Zmena -- MyEdit.Lines:= uAtom^.List;
    MyEdit.Lines.Assign(uAtom^.List);
   Status ('File: '+uFileName, 0);
  End Else Status ('Can not open unit!', 3);



Je zaujimave, ze vsade na forach sa riesil opacny problem. Nedokazali vytvorit kopiu. Priklad:
Kód: [Vybrat]
Var A, B : TStrings;
A:=B;
Stale ked prepisu B, prepise im to aj text v A. Nedokazali spravit zalohu textu. Tento problem riesili prave funkciou A.Assign(B);

Online Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 445
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Ulozenie rukovete TStrings
« Odpověď #3 kdy: 20-06-2020, 09:34:55 »
Excellent
Rated 1 time
Opravdu se na Slovensku říká pointeru "rukověť"? Nepoužívá se ukazatel?

TStrings je objekt.
Proměnná typu TStrings je pouze ukazatel na objekt.
var
  A, B: TStrings;
begin
  ...
  { pokud provedu tohle, pak B i A ukazují na stejný obsah TStrings a je jedno, jestli měním obsah A nebo B }
  B := A;



Je to stejné jako bys měl:

var
  myLabel: TLabel;
begin
  myLabel := Label1;
  myLabel.Caption := 'Teď jsem změnil caption na formu u Label 1';


Assign provede kopii obsahu objektu z jednoho do druhého a ty zůstávají samostatné.
K dispozici máš zdroje, takže nic nebrání tomu, aby ses podíval, co Assign ve skutečnosti dělá.