Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - uložení nastavení programu.

Dobrý den,
naklikal jsem si v Delphi jeden jednoduchý prográmek. Mám tam pár checkboxů, listboxů a comboboxů. Listboxy ukládám do samostatných txt souborů, díky
http://pc.poradna.net/q/view/778114-delphi-listbox #r778118
ale jak na checkboxy a comboboxy? Bohužel to ani nikde nemohu na internetu najít, přitom mi to příjde jako celkem zásadní věc pro použitelnost programů :-| Jak se to tedy řeší? Je na to něco jednoduchého?

Předmět Autor Datum
Riesi sa to tak ze si ulozis do registry do vetvy svojho programu ktoru si vytvoris napr. polozku ty…
MM.. 10.06.2012 22:33
MM..
Textové súbory sa zapisujú do LocalAppData a nie do ProgramFiles. Textové súbory sa používajú, preto…
los 11.06.2012 00:13
los
Těch možností je hodně. Každopádně pokud listboxy ukládáš do txt, pak by jsi neměl zbytečné lezt je…
AZOR 10.06.2012 22:37
AZOR
zbytečné lezt ještě do registru lezt do registru je jednoduchsie jak parsovat syntax a robit error…
MM.. 11.06.2012 19:48
MM..
Díky oběma za nakopnutí. Použil jsem http://www.zive.cz/clanky/umime-to-s-delphi-69-dil --prace-se-s…
delfínek 11.06.2012 00:00
delfínek
Tak jsem všechno kromě ListBoxů vyřešil do registru, funguje to parádně. Teďka ještě ten Listbox, je…
delfínek 11.06.2012 13:41
delfínek
A v cem se ti to zda slozite? Ukladas viceradkovy string. Napis si na to funkci, ktere predas ListBo…
Jan Fiala 11.06.2012 13:59
Jan Fiala
Složité se mi zdálo, že na to potřebuji funkci. Ten DelimitedText to dělá v jednom řádku, což je per…
delfínek 11.06.2012 14:30
delfínek
Len do registry strkaj len male mnozstvo dat, ak ten tvoj listbox moze mat 3miliony poloziek tak to…
MM.. 11.06.2012 19:42
MM..
Tak bych ještě potřeboval trknout. Mám proceduru, kterou spouštím tlačítkem. Jak teď udělat, aby se…
delfínek 13.06.2012 16:02
delfínek
Takze u tlacitka Button4 mas udelanou udalost OnClick. V objectInspector u tlacitka Button7 jako uda…
Jan Fiala 13.06.2012 16:35
Jan Fiala
Děkuji. Toho rozbalovacího seznamu jsem si nevšiml, to je paráda. Ale to volání funkce nechce fungov…
delfínek 13.06.2012 16:55
delfínek
Jen form1, bez toho T. Tform1 je typ. ... then form1.Button4Click(Sender); A za druhé. Když je But…
J.M. 13.06.2012 17:34
J.M.
No je vidět, že musím ještě pilovat základy. Toto samozřejmě funguje. Děkuji.
delfínek 13.06.2012 18:35
delfínek
Tohle nechapu. Co vlastne chces delat a proc podle nastaveni nejakeho ComboBoxu volas udalosti, kter…
Jan Fiala 13.06.2012 17:46
Jan Fiala
Pokud je v comboboxu vybráno "po spuštění programu", tak chci spustit tu samou proceduru, která se j…
delfínek 13.06.2012 18:41
delfínek
Sender je objekt (ukazatel na nej), ktery udalost vyvolal. Nil = nic, prazdny ukazatel. Pokud nepotr… poslední
Jan Fiala 13.06.2012 19:29
Jan Fiala

Riesi sa to tak ze si ulozis do registry do vetvy svojho programu ktoru si vytvoris napr. polozku typu integer ako bitmasku alebo jednoducho 0=nezaskrtnuty, 1=zaskrtnuty, apod.
Textove subory sa nepouzivaju z viacerych dovodov: parsovat to s error checkingom je totalna pakaren, a za druhe by si mal problem u vista a vyssie (nemoznost zapisu do zlozky program files)

Textové súbory sa zapisujú do LocalAppData a nie do ProgramFiles. Textové súbory sa používajú, pretože sú portovateľné a používateľ ich môže editovať. Registre majú síce tiež svoje výhody (bežní používatelia ich nezmenia a tí pokročilí si uvedomujú, že program môže prestať fungovať), ale aj súbory sú ok.

Tak jsem všechno kromě ListBoxů vyřešil do registru, funguje to parádně. Teďka ještě ten Listbox, jenže jak na to?

Něco jako

Reg.WriteString('ListBox1', ListBox1.Items);

má problém s TStringem, což jsem předpokládal že ListBox má každý řádek jako vlastní String, takže to nepůjde.

Na internetu jsem našel

var
s: String;
I: Integer;
begin
for I := 0 to ListBox1.Items.Count-1 do
s := ListBox1.Items[I] + #0;
s := s + #0;

with TRegistry.Create(KEY_WRITE) do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('Software\MyApp', True) then
Windows.RegSetValueEx(CurrentKey, 'Items', 0, REG_MULTI_SZ,
Pointer(s), SizeOf(Char) * (Length(s)+1));
finally
Free;
end;
end;

, nejde to nějak lépe a jednodušeji?

A v cem se ti to zda slozite? Ukladas viceradkovy string.
Napis si na to funkci, ktere predas ListBox, nazev vetve v registrech a ona to udela.
Pak ji jen budes volat.

Muzes to udelat tak, ze obsah listboxu budes uklada a nacitat z retezce:

Registry.WriteString(CurrentKey, 'Items', ListBox.Items.DelimitedText);

Pokud mas obsah listboxu napr:
radek jedna
radek dva
radek tri
pak vysledek funkce DelimitedText je:
"radek jedna","radek dva","radek tri"

Tak bych ještě potřeboval trknout. Mám proceduru, kterou spouštím tlačítkem. Jak teď udělat, aby se spustila i dalším tlačítkem? Zkusil jsem to napsat jako samostatnou proceduru a oběma tlačítkama ji volat, ale to mi nefungovalo, protože z té samostatné procedury to psalo chybu u jakékoliv práce s formulářem :(

procedure TForm1.Button7Click(Sender: TObject);
begin
  tform1.Button4Click(?);
end;

Takze u tlacitka Button4 mas udelanou udalost OnClick.
V objectInspector u tlacitka Button7 jako udalost OnClick vyberes z rozbalovaciho seznamu Button4Click.
A nemusis nic programovat, obe tlacitka budou pouzivat stejnou udalost.

K tomu tvemu prikladu, jako parametr pousijes Sender, ktery ti predala udalost Button7Click:

procedure TForm1.Button7Click(Sender: TObject);
begin
  tform1.Button4Click(Sender);
end;

Děkuji. Toho rozbalovacího seznamu jsem si nevšiml, to je paráda. Ale to volání funkce nechce fungovat. Kontroluji to s nastavením

if ComboBox1.ItemIndex=1 then tform1.Button4Click(Sender);

a píše to

unit1.pas(252,54) Error: Wrong number of parameters specified for call to "Button4Click"
unit1.pas(123,18) Hint: Found declaration: TForm1.Button4Click(TObject);
unit1.pas(259) Fatal: There were 1 errors compiling module, stopping

Prošel jsem si celou kapitolu učebnice o funkcích a procedurách a nic jsem nenašel co bych mohl dělat špatně.
:.(

Jen form1, bez toho T. Tform1 je typ.

... then form1.Button4Click(Sender);

A za druhé. Když je Button7Click i Button4click ve stejném formuláři, je lepší napsat to prostě jako then Button4Click(Sender) bez toho form1. Kdybys totiž vytvořil další formuláře typu TForm1, pak klik na kterýkoli button7 ti zavolá Button4Click v tom prvním formuláří, a ne v tom, kde je klikaný button.

procedure TForm1.Button7Click(Sender: TObject);
begin
Button4Click(Sender);
end;

Pokud je v comboboxu vybráno "po spuštění programu", tak chci spustit tu samou proceduru, která se jinak spouští tlačítkem. Takže vlastně tu proceduru Button4Click spouštím na základě porovnání hodnoty comboboxu při form.create. Nyní to již funguje. Evidentně v tom mám ještě zmatek, ale to se snad všechno vypiluje. :puff:

Ještě dotaz, jaký je rozdíl mezi (nil) a (sender) a k čemu to tam vůbec je, když není potřeba proceduře nic předat?

Zpět do poradny Odpovědět na původní otázku Nahoru