Autor Téma: jak uložit a zase nahrát obsah programu s vyplněnými komponenty edit?  (Přečteno 4459 krát)

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Možností je hafo... Tenhle kód např. uloží texty ze všech objektů typu TEdit do INI souboru
ve formátu hodnot vlastností Name=Text do sekce [EditValues].

Uložení:

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   I: Integer;
  4.   IniFile: TIniFile;
  5.   Component: TComponent;
  6. begin
  7.   IniFile := TIniFile.Create('c:\Somewhere\AppData.ini');
  8.   try
  9.     for I := 0 to ComponentCount - 1 do
  10.     begin
  11.       Component := Components[I];
  12.       if Component is TEdit then
  13.         IniFile.WriteString('EditValues', Component.Name, TEdit(Component).Text);
  14.     end;
  15.   finally
  16.     IniFile.Free;
  17.   end;
  18. end;

Načtení:

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   I: Integer;
  4.   IniFile: TIniFile;
  5.   Component: TComponent;
  6.   EditValues: TStringList;
  7. begin
  8.   IniFile := TIniFile.Create('c:\Somewhere\AppData.ini');
  9.   try
  10.     EditValues := TStringList.Create;
  11.     try
  12.       IniFile.ReadSectionValues('EditValues', EditValues);
  13.       for I := 0 to EditValues.Count - 1 do
  14.       begin
  15.         Component := FindComponent(EditValues.Names[I]);
  16.         if Component is TEdit then
  17.           TEdit(Component).Text := EditValues.ValueFromIndex[I];
  18.       end;
  19.     finally
  20.       EditValues.Free;
  21.     end;
  22.   finally
  23.     IniFile.Free;
  24.   end;
  25. end;

Budu rad kdyz se na to mrkne i nekdo zkusenejsi a trosku pokrytizuje :)))) jsem totalni zacatecnik a ucim se

- kritizovat se píše s měkkým i ;)

- formátování kódu... Je možná moderní, že si každý programátor zkouší vytvořit vlastní styl formátování kódu,
  ale věř nebo ne, ten by měl být jenom jeden a používaný všemi (viděl jsem už dost "originalit", na které byla
  "radost pohledět", bohužel byly totálně nečitelné). Punk je zkrátka jinde ;)

- zkus psát v angličtině. Vím, že je to buřtfuk a místní komunita mě za to ukamenuje, ale ani nevíte jak trapně
  vypadá v prod. kódu název eventy např. OnOcasekClick v kombinaci s OnRoutePointClick u stejné třídy...

- snaž se vyhnout použití globálních proměnných (proměnná DataFile) co to jen jde. Jejich (nadměrné) použití
  většinou značí chyby v návrhu. Pokud bys však nechtěl TIniFile objekt vytvářet pokaždé znovu, mohl bys ho
  nadeklarovat třeba jako privátní pole toho formuláře, tj:

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     Edit1: TEdit;
  4.     Edit2: TEdit;
  5.     Button1: TButton;
  6.     Button2: TButton;
  7.     OpenDialog1: TOpenDialog;
  8.     procedure Button1Click(Sender: TObject);
  9.     procedure Button2Click(Sender: TObject);
  10.   private
  11.     FDataFile: TIniFile; // <- namísto globální proměnné si můžeš vytvořit privátní pole třídy (F na začátku značí "F"ield)
  12.   public
  13.     { Public declarations }
  14.   end;
« Poslední změna: 31-07-2013, 23:00:05 od TLama »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
- zkus psát v angličtině. Vím, že je to buřtfuk a místní komunita mě za to ukamenuje, ale ani nevíte jak trapně
  vypadá v prod. kódu název eventy např. OnOcasekClick v kombinaci s OnRoutePointClick u stejné třídy...
Spis bychom meli ukamenovat ty, co uci zanaset nejake narodni  patvary do anglickeho  programovaciho prostredi >:( 

Tem bych doporucoval, ze kdyz cesky tak cesky, jako to ma Soukup v Baltikovi pro prvnacky nebo to mival za bolsevika Bokr v Jazalu v Plzni na technice:
dokud (...) dělej ..., když (...) tak ... jinak ....(nebo jak to vypadalo). Ovsem to byl problemove orientovany jazyk pro logicke automaty a dneska zda se po nem neni ani vidu ani slechu, i kdyz Bokr na te skole stale funguje...

Umet pojmenovavat strozumitelne anglicky entity v programu je podle me nezbytna podminka, at uz na trhu prace nebo treba kvuli moznosti poslat dotaz na Stack Overflow nebo do jineho mezinarodniho fora. Tam nad fragmentem kodu demonstrujiciho problem a obsahujicim neaglicke symboly taky nikdo nejasa, spis ho vyfuckuji.

Cim driv si nekdo osvoji vhodnou slovni zasobu, tim lip.


A pokud clovek nepise prg, u ktereho si neni absolutne jisty, ze ho nikdy nebude lokalizovat do jineho jazyka, tak bych vrele doporucil jako prvnotni verzi delat anglickou (te rozumi kazdy) a do cestiny ji prekladat jako do kterehokoli ciziho jazyka. Jinak si zbytecne pridelava praci, protoze rada toolu generuje z textu automaticky identifikatory a cestina se jim tam vetsinou dost nelibi

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
ale v jadru to zase tak spatne nemam ne ???
Funkcni to splni a to je to hlavni

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
ale v jadru to zase tak spatne nemam ne ???
Funkcni to splni a to je to hlavni
No, základní myšlenka je v pořádku. Akorát že tam máš chybu jako kráva, u které se divím, že ti ji zatím nikdo neomlátil o hlavu: Schválně si zkus, co se stane, když v tom OpenDialogu žádný soubor nevybareš a klikneš na Cancel... Snad tě to poučí, že konzistentní odsazování není jen taková parádička, ale má reálný smysl. Jo, a při ukládání bys eventuelně mohl ten TIniFile zase uvolnit, ale to počítám vzniklo jen při kopírování do fóra.

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
ano to vim ze kdyz nic nevyberu ze to hodi chybu..... ale nevim kde tu chybu delam aby to nedelalo..... a to uvolneni jsem jen nedopsal. u cteni jsem ten soubor uvolnoval

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
ano to vim ze kdyz nic nevyberu ze to hodi chybu..... ale nevim kde tu chybu delam aby to nedelalo.....

Máš to blbě naformátované, to je celé. Za then ti chybí blok, takže se provede jenom ten jeden řádek a to try-finally se provede vždy, zatímco ty předpokládáš, že jenom v případě, že ten dialog uživatel nezrušil.

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
a muzu poprosit jak by to melo vypadat ???? diky moc

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
a muzu poprosit jak by to melo vypadat ???? diky moc

Kód: Delphi [Vybrat]
  1. var
  2.   IniSoub: TIniFile;
  3. begin
  4.   if OpenDialog1.Execute then
  5.   begin // <- tady ti chyběl begin..end blok
  6.     IniSoub := TIniFile.Create(ChangeFileExt(OpenDialog1.FileName, '.INI'));
  7.     try
  8.       Edit1.Text := IniSoub.ReadString('Prvni_policko', 'login', Edit1.Text);
  9.       Edit2.Text := IniSoub.ReadString('Druhy_policko', 'pass', Edit2.Text);
  10.     finally
  11.       IniSoub.Free;
  12.     end;
  13.   end;
  14. end;