V Delphinu 7 se mi povedlo smazat položku Nástroje z menu a nevím jak to obnovit. Je to už uložené, takže to celé zmizlo. Mám tu původní verzi kde jsou původní zdroje... Dá se to nějak přesunout? Prostě jsem myslel že jsem vymazal Nástroje->Uživatel ale místo toho jsem smazal Nástroje, uložil a zkompiloval
Fórum › Delphi
Jak obnovit ztracenou položku menu?
#2 oxidián
nohlo by jít, otevřeš si starou verzi formulář si sobrazíš v textovém režimu a zkopíruješ si tu část menuitem - nástroje včetně těch položek.
object ools1: TMenuItem
Caption = 'N'#225'stroje'
GroupIndex = 2
object createBook1: TMenuItem
Caption = 'Vytvo'#345'it u'#269'ebnici'
OnClick = createBook1Click
end
object N2: TMenuItem
Caption = '-'
end
object history1: TMenuItem
Caption = 'Historie test'#367
OnClick = history1Click
end
object createOrEdit1: TMenuItem
Caption = 'Vytvo'#345'it nebo editovat test'
OnClick = createOrEdit1Click
end
object search1: TMenuItem
Caption = 'Hled'#225'n'#237' soubor'#367
OnClick = search1Click
end
end
// konec další část už se týká další položky menu Help
object Help1: TMenuItem
tedy nezkoušel jsem to, otázkou je jestli se to správně promítne do kodu, možná bys pak musel ještě zkopírovat odpovídající část kodu. podle těch identifikací objektů.
#2 oxidián
Jinak takhle velkou předělávko sis v podstatě jen zavařil, malé úpravy ba ještě tak šli, ale ty překopáváš komplet program, to je kolikrát lepší ho vytvořit odznovu podle fungování vzoru.
Z objektového hlediska bys měl mít
třídu jména s položkami objektů (tříd)
- nastavení (uživatelská nastavení fontů a pod)
- list výsledků testů (bud jen výsledky nebo včetně historie Otázek a odpovědí)
- aktuální test (může být prázdný nebo přerušený)
kazdá třída serializace pro ukládací nahrávací funkci
Není to tak těžké a až tak do detailu to neřeším. Stačí vytvořit pár menu... Uvažuju jestli by to šlo udělat tak, že by se do menu Učebnice->Hebrejština-> ... vypsaly všechny položky učebnic automaticky? Tam bude třeba programátorsky vytvořit ty objekty TMenuItem, co?
#6 oxidián
jde to stačí použít přítele googla hledat: delphi dynamic menu items
dobře popsaný je to třeba zde:
https://stackoverflow.com/questions/2345381/delphi-dynamic-menu-items
nebo spíš zde
https://stackoverflow.com/questions/35060054/tmainmenu-build-menu-item-dynamic
záleží jak to chceš mít provedený, zda seznam přímo v menu =druhý odkaz nebo v PopUp okýnku =první odkaz
Dotaz: jakou událost mám aktivovat když v listbox1 kliknu na položku? Nebo jak přiřadit procedury události onClick či onSelect nebo s čím se tam pracuje? Jde mi o to, že když vyberu položku s listboxu tak by se formulář Book měl vyplnit údajema z té vybrané položky. Aby bylo možné učebnici zeditovat.
Už to vidím je to ten kód
procedure TBooksDialog.ListBox1Click(Sender: TObject);
begin
if listbox1.itemindex<>-1 then
begin
OKbtn.enabled:=true;
ubrat.enabled:=true;
caption:='Učebnice: '+
listbox1.items[listbox1.itemindex];
end;
end;
takže tam to doplním
#14 oxidián
jj to je při najetí a kliknutí (označení položky) dá se udělat i multi select, nebo jedno kliknutí označení a druhý (ne doubleclick) odznačení, na double si pak můžeš udělat proceduru na editaci, kdy se ti tam do formuláře načtou všechny ty údaje.
Omylem jsem označil za vyřešené. Jen potřebuju dořešit tuhle věc:
procedure TBooksDialog.ListBox1Click(Sender: TObject);
begin
if listbox1.itemindex<>-1 then
begin
OKbtn.enabled:=true;
ubrat.enabled:=true;
caption:='Učebnice: ' + listbox1.items[listbox1.itemindex];
BookList := TStringList.Create;
try
ExtractStrings([';'], [], PChar(listbox1.items[listbox1.itemindex]), BookList);
edit1.text := BookList[5];
edit2.text := BookList[0];
edit3.text := BookList[1];
edit4.text := BookList[2];
edit5.text := BookList[3];
edit6.text := BookList[4];
finally
BookList.Free;
end;
end;
end;
Když dám do kukátka BookList.text tak tam vidím asi jen 4 položky, ale má hich být 7. Takže mi to krachuje u
edit1.text := BookList[5];
protože index 5 tam není. To je normální tohle omezení? Mám použít jinou techniku na splitování? Tohle se mi zdálo elegantní.
#16 oxidián
já mám na splitování vlastní knihovnu, ale tím to nebude, jde spíš o to jestli máš ve vybraným řádku opravdu 5 položek oddělených středníkem a pozor otázkou je jak se chovají třeba 2 středníky vedle sebe.
EDIT: pošli aktuální stav včetně uloženejch věcí, já to nemám s čím zkouknout a chybí mi tam asi něco co jsi dnes dělal.
Jo tak to bude těma dvěma středníkama vedle sebe oni se některé záznamy nemusí vyplnit... Jako třeba vydavatelství a rok vydání mi tam chybí.
procedure TBooksDialog.PridatClick(Sender: TObject);
var s: string;
begin
if (edit1.text='') or (edit2.text='') or (edit3.text='') then exit;
s := edit2.text + ';' + edit3.text + ';' + edit4.text + ';' + edit4.text + ';' + edit5.text + ';' + edit6.text + ';' + edit1.text + ';' + edit7.text;
listbox1.items.add(s);
listbox1.items.savetofile(booksFileName);
listbox1.itemindex:=listbox1.items.indexof(edit1.text);
edit1.text:='';
ubrat.enabled:=true;
OKbtn.enabled:=true;
end;
Vyzkouším co to udělá, když vyplním vše... Jo tak je to tím. Takže tam musím dát ještě mezeru když je to prázdné?
Hlásím ještě jeden problém
procedure TBooksDialog.Edit1Enter(Sender: TObject);
begin
listbox1.itemindex:=-1;
ubrat.enabled:=false;
Okbtn.enabled:=false;
if isLoaded then clearEdits;
isLoaded := true; // Edit1Enter se spouští automaticky po otevření formuláře
end;
Situace:
Otevřu formulář. Caption se načtou do polí dle defaultních hodnot. Pak kliknu na položku v listboxu a načtou se data do formuláře. Až sem vše v pohodě. Ale dále je problém. Když změním fokus na nějaké pole edit, tak se spouští tato funkce. Tím pádem příkaz:
if isLoaded then clearEdits;
vymaže textové hodnoty z polí edit.
Tato funkce Edit1Enter se spouští i po otevření formuláře a proto tam je ta podmínka if isLoaded aby se nevymazala defaultní captions.
Pochopitelně potřebuju vymazat pole edit až po vložení učebnice do seznamu anebo po uzavření toho okna. Tedy kam mám to clearEdit; strčit? Tady to nevyhovuje.
počkat to enter znamená, jako že jsem dal focus na pole?
TBooksDialog.Edit1Enter
Do jaké funkce mám dát ten kód když se má spouštět poté co potvrdím změnu?
Zkoušel jsem toto:
procedure TBooksDialog.Edit1Exit(Sender: TObject);
begin
if isLoaded then clearEdits;
end;
místo předchozího, to je lepší, ale když z edit7 kliknu na edit1 nebo když kliknu na Přidat (knihu) tak se vše vymaže a do listboxu se nepřidá nic.
Jo a ještě mám dotaz co musím udělat aby když mačkám tabulator od edit1 až po edit7 aby fokus nepřeskakoval napřeskáčku ale postupně pole za polem?
Právě naopak. Po zobrazení formuláře to nedělá nic. Po kliknutí na přidat nebo ubrat vyčistím edity. To mám. Ale teď potřebuju funkci, která se spustí po uzavření dialogového okna. Vidím událost OnDestroy tak tu zkusím.
No a nefunguje mi to (když zavřu nebo zruším formulář).
procedure TBooksDialog.destroy(Sender: TObject);
begin clearEdits; end;
end.
Jinak ono by to fungovalo kdybych na tlačítka OK a Zrušit dal onclick--- clearEdits ale to není jedna funkce, událost pro to uzavření formuláře?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak přiřadit položku menu do objektu? — založil oxidián
Funkce odkazující na položku menu — založil oxidián
[PHP] Ako urobit polozku v menu vyznacenou? — založil Tocimanko
Jak obnovit DIV — založil nikos