PageControl menük
A megoldás lényege, hogy a PageControl komponens két fülének mindegyikéhez egy-egy PopupMenu komponenst rendelünk és jelenítünk meg abban az esetben, ha a fülek valamelyikére kattintunk az egér jobb gombjával. Ennek érdekében elkészítettünk egy DoPopup metódust, melynek bemenő paraméterei a kurzor koordinátái kattintáskor.
Szükségünk van egy TTCHitTestInfo típusú objektumra.
Az objektumra azért van szükség, hogy le tudjuk ellenőrizni a kattintás alatti fül objektumát, mivel a Perform metódus ezt az objektumot várja paraméterként.
hi.pt.x := X;
hi.pt.y := Y;
hi.flags := 0;
TabIndex := PageControl1.Perform(TCM_HITTEST, 0, longint(@hi));
Amennyiben a kapott index nem -1, vagyis a komponens egyik füle fölött történt a kattintás, akkor meghatározzuk azt a koordinátát, melyben majd meg kell jeleníteni az adott menüt.
p.x := PageControl1.Left + X;
p.y := PageControl1.Top + y;
p := ClientToScreen(p);
Ha ez is megvan, akkor meg is jeleníthetjük az aktuálisat.
case TabIndex of
0: PopupMenu2.Popup(p.x, p.Y);
1: PopupMenu1.Popup(p.x, p.Y);
end;
A metódust természetesen akkor hívjuk meg, ha az egér jobb gombjával kattintottunk a fülek valamelyikén.
if Button = mbRight then begin
DoPopup(X, Y);
end;
Demo alkalmazás készítése egyszerűen
Demo alkalmazás készítésekor vagy olyan feltételekkel futtatható az alkalmazás, hogy a funkciók csak korlátozottan használhatók, vagy egy bizonyos idő után az alkalmazás nem használható.
Az utóbbi esetet megvalósíthatjuk egy időkorláttal, vagy egyszerűen úgy, hogy eltüntetjük az alkalmazás futtatható állományt. Ezt a demo alkalmazás futásának befejezésekor végezzük el.
A megoldásban egy batch állományt generálunk ideiglenesen, mely elvégzi az EXE állomány törlését, majd magát is törli. A DeleteExecutable metódusban a következőképpen járunk el:
Létrehozunk a projekt futtatható állományával azonos néven egy .BAT kiterjesztésű állományt.
assignfile(f,changefileext(paramstr(0),'.bat'));
rewrite(f);
Ezt követően egy címke után kiírjuk a szükséges utasításokat. Az első utasítás, hogy az ERASE parancssori utasítással töröljük az EXE állományt.
writeln(f,format('Erase "%s"',[paramstr(0)]));
Ekkor a következő szintaxis szerint járunk el:
ERASE <törlendő állomány elérési útja>
Majd elhelyezünk egy olyan sort is, mely újra megvizsgálja az EXE állományt, és ha létezik, akkor az :1 címkére ugrik, és a művelet kezdődik elölről.
writeln(f,format('If exist "%s" Goto 1',[paramstr(0)]));
Végül töröljük a parancsállományt is.
writeln(f,format('Erase "%s"',[changefileext(paramstr(0),'.bat')]));
closefile(f);
A létrehozás után a batch állományt le is futtatjuk a WINEXEC metódussal.
winexec(PChar(changefileext(paramstr(0),'.bat')),sw_hide);
halt;
A művelet eredményeképpen a két állomány visszaállíthatatlan módon törlődik.