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?
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.
Těch možností je hodně.
Každopádně pokud listboxy ukládáš do txt, pak by jsi neměl zbytečné lezt ještě do registru ale měl by jsi udělat nějakej konfigurační soubor - objektovej či INI:
Triky.htm
Triky.htm
lezt do registru je jednoduchsie jak parsovat syntax a robit error checking a opravovat to ked sa to poskodi apod.
Díky oběma za nakopnutí. Použil jsem
http://www.zive.cz/clanky/umime-to-s-delphi-69-dil --prace-se-systemovym-registrem/sc-3-a-109881/defa ult.aspx
což funguje a tak to trochu upravím pro svoji potřebu. A listboxy též předělám do registru.
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
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
, 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:
Pokud mas obsah listboxu napr:
radek jedna
radek dva
radek tri
pak vysledek funkce DelimitedText je:
"radek jedna","radek dva","radek tri"
Složité se mi zdálo, že na to potřebuji funkci. Ten DelimitedText to dělá v jednom řádku, což je perfektní. Děkuji moc, nyní mám hotovo
Len do registry strkaj len male mnozstvo dat, ak ten tvoj listbox moze mat 3miliony poloziek tak to radsej davaj do suboru (len obsah listboxu). Ak to neni vela dat tak mozes do registry.
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 :(
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:
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
a píše to
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;
No je vidět, že musím ještě pilovat základy. Toto samozřejmě funguje. Děkuji.
Tohle nechapu. Co vlastne chces delat a proc podle nastaveni nejakeho ComboBoxu volas udalosti, ktere se volaji po stisknuti tlacitek?
TForm1 tam nema co delat. Zavolej jen Button4Click(nil);
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.
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?
Sender je objekt (ukazatel na nej), ktery udalost vyvolal. Nil = nic, prazdny ukazatel.
Pokud nepotrebujes predavat objekt, muzes predat nil.
Pokud procedure neco predas a ona to nepotrebuje zpracovavat, nic se nestane.