Delphi --- Sekalaiset 2
Kun teet esim. sisäkkäisiä for-lauseita ja parin tunnin ähellyksen jälkeen
vedät herneen nenään, koita seuraavaa:
-Laita kursori esim. begin riville ennen nitrokohtaa.
-Älä laita tyhjälle tai kommentti riville.
-Valitse Run-valikosta Run to Cursor ( tai F4 )
-Ohjelma toimii normaalisti siihen saakka kunnes kohtaa rivin, jolle jätit kursorin.
-Tästä eteenpäin menet Trace into-painikkeella rivi kerrallaan ja koitat selvittää
muuttujien arvoja, pitämällä hiiren kursoria hetken aikaa paikallaan muuttujan päällä.
-Tietenkin muuttujat voi asettaa erityisseurantaan Add Watch at Cursor...
jossa pääset seuraamaan muuttujien arvoja jatkuvasti.
//Tiedoston tallennus:
1. Oletuksena tallennetaan aina samaan hakemistoon,
samaan paikkaan missä ohjelma on.
2. Ei tarvitse kirjoittaa aina tallentaessa .txt päätettä}
procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName); //1.
SaveDialog1.DefaultExt := 'txt'; //2. (huom! Ei pistettä ennen txt:tä)
if SaveDialog1.Execute then
begin
ListBox1.Items.SaveToFile(SaveDialog1.FileName);
end;
end;
{Jos haluat rivin, jolla kulutetaan vain aikaa,
voit käyttää Windowsin Sleep funktiota. Sulkujen sisältö
on millisekunteja. 1000 = 1s.}
Sleep(500); //Krooh... Zzzz!
//Muista, että uses lauseesta pitää löytyä Windows,
//Mielestäni tietokanta sovellukset tarvitsevat ns. odotusikkunan:
//Avaa joku projekti johon haluat odotusikkunan
//Lisää uusi formi: File... New Form...
//Tallenna projektisi tässä vaiheessa.
//Nyt projektissa on kaksi formia jotka molemmat ladataan automaattisesti
//muistiin, joten:
//Mene Project... Options... Forms-välilehti, klikkaa juuri luomasi formi
//valituksi ja siirrä se Available forms puolelle > napilla ja paina OK.
//Muokkaa vielä View... Project Source ja muuta se seuraavanlaiseksi:
program Project1;
uses
Forms,
Windows, //Sleep löytyy täältä
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
begin
Form2 := TForm2.Create(Application); //Luodaan
Form2.Show; //Näytetään
Form2.Update; //Päivitetään
Application.CreateForm(TForm1, Form1); //ladataan form1:nen
Sleep(3000); //näytetään form2:sta 3 sekuntia
Form2.Close; //suljetaan
Form2.Free; //vapautetaan muisti
Application.Initialize;
Application.Run;
end.
// Nyt muutat Form2:sen ulkonäön mieleiseksi ja että se avautuu
// keskelle.
Objektin tasaus toisiinsa nähden:
Valitse ensin se objekti joka jää paikoilleen.
Paina shift (vaihto) pohjaan ja valitse vielä tasattava objekti.
Nyt pitäisi olla molemmat objektit valittuina.
Mene Edit... Align... valitse vaikka Horizontal Centers ja Ok.
{Liikuttaessa StringGrid:ssä Tabilla, focuksen ollessa viimeisessä solussa,
lisätään uusi rivi.
StringGrid nimetty SG:ksi.
SG:ssä aina 6 saraketta ja kaksi riviä, lisärivit lisätään tarpeen mukaan.}
procedure TForm1.SGKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin//1.
if (SG.Col = 5) and (SG.Row > SG.RowCount-2) then
begin//if
case Key of VK_TAB : begin
SG.RowCount := SG.RowCount + 1;
end;
end;//case
end;//if
end;//1.
Valikon kuvista...(Delphi 5)
Jos ohjelmassasi on esim. Edit valikko, jota klikkaamalla aukeaa Cut, Copy ja Paste
valinnat ja haluat laittaa bittikarttakuvat Cut, Copy ja Paste valintojen eteen,
tee seuraavasti:
Pudota ImageList1 komponentti lomakkeelle, kaksoisklikkaa sitä ja lataa
siihen tarvittavat (toimintoja kuvaavat) kuvat ja sulje OK.
Kaksoisklikkaa MainMenu1 komponenttia, saat auki valikkoeditorin
josta klikkaa Edit valikko siniseksi (valituksi).
Laita Object Inspectorin Edit valikon SubMenuImages arvoksi ImageList1.
Tarkista että Edit valikon ImageIndex on -1 (ei kuvaa).
Klikkaa valikkoeditorista Cut valituksi ja laita ImageIndex arvoon 0.
Klikkaa valikkoeditorista Copy valituksi ja laita ImageIndex arvoon 2.
Klikkaa valikkoeditorista Paste valituksi ja laita ImageIndex arvoon 4.
Oletuksena tässä on, että kaikki kuvat on kahden kuvan kuvalistoja.
Siitä index arvot...huoh!
PS. Jos haluat selvitä yhdellä ImageList-komponentilla koko valikossa, lataa
ImageList1 klikkaamalla kerran MainMenu1:stä ja laita Object Inspectorin
Images arvoksi ImageList1.(Hmm... meniköhän edes sinne päin?)
//Joitain funktioita joita voit tarvita:
GetUserName //funktiolla haet tietokoneen käyttäjän nimen
GetComputerName //funktiolla haet tietokoneen nimen
GetVolumeInformation //funktiolla haet esim C aseman sarjanumeron
// Voit muotoilla MessageDlg viestejä :
MessageDlg('Ohjelma tulostaa, tallentaa ja tarkistaa lottokupongin.'#10
+' '#10 // tyhjä rivi + rivinvaihto
+'TIETOKONE ARVONTA:'#10
+'Tarkista että Num Lock on päällä.'#10
+'Pidä ENTERIÄ pohjassa vähän aikaa ja päästä.'#10
+'Plus-napilla viet listaan ja miinus-napilla poistat.'#10
+'Delete tyhjentää kaikki.'#10
+' '#10 // tyhjä rivi + rivinvaihto
{* jatkuu...jne...plää...plää...plää *}
,mtInformation,[mbOk],0); //MessageDlg:n loppu
//Viitenumeron tarkistusnumeron laskeminen
//Koodin kirjoittanut Jarmo Kivirinta
procedure TForm1.TarkistaViiteClick(Sender: TObject);
var viite, apurivi, tarkistusnumero, temp2: string;
var i, temp, luku1, luku2: integer;
begin
temp:=0;
temp2:='';
viite:=Edit1.Text;
apurivi := '731731731731731731731731731731731';
for i := 0 to Length(viite)-1 do
begin
temp2:=temp2+viite[Length(viite)-i];
end;
viite := temp2;
for i := 1 to Length(viite) do
begin
luku1:=StrToInt(viite[i]);
luku2:=StrToInt(apurivi[i]);
temp:=temp+(luku1*luku2);
end;
viite:=IntToStr(temp);
tarkistusnumero:=viite[Length(viite)];
luku1:=StrToInt(tarkistusnumero);
tarkistusnumero:=IntToStr(10-luku1);
viite:=Edit1.Text+tarkistusnumero;
Label1.Caption:=viite;
end;
//StrToFloatDef (Sama kuin delphin oma StrToFloat, mutta kestää virheet).
//Koodin kirjoittanut Jarmo Kivirinta
function StrToFloatD(str: string; luku: real): real;
var
s: string;
r: real;
i: integer;
desimaali: boolean;
begin
s := '';
desimaali:=True;
for i:=1 to Length(str) do
if str[i]=',' then str[i]:='.';
if Length(str)>0 then
for i:=1 to Length(str) do
case str[i] of
'0'..'9': s:=s+str[i];
else
begin
if str[i]='.' then
if desimaali then
begin
s:=s+'.';
desimaali:=False;
end;
end;
end;
r:=luku;
if s <> '' then r:=StrToFloat(s);
StrToFloatD:=r;
end;
Formille BMP-kuva resurssista.(PP 15.3.2001)
-Tee *.bmp kuva (tässä esimerkissä Width 108 Height 60).
-Aseta Image-komponentti formille ja säädä koko vastaamaan kuvan kokoa.
-Laita tekemäsi kuva delphin projektihakemistoon ja
käynnistä Resources Workshop ohjelma. Muuta kuvatiedosto
*.res tiedostoksi compile painikkeella. Kuva nimettiin pie.RES:iksi
-Käy katsomassa että res tiedosto todella löytyy sieltä!
-Jos löytyy, niin laita uses rimpsun jälkeen, ennen type lausetta rivi:
{$R pie.res} //sidotaan resurssi exe-tiedostoon
-Käännä ohjelma...mitään muuta ei vielä tapahtunut kuin exe-tiedoston koko
kasvoi kuvatiedoston verran.
-Laita FormGreateen:
procedure TForm1.FormCreate(Sender: TObject);
var ResBMP: TBitmap;
begin
ResBMP := TBitmap.Create; //luodaan
try
ResBMP.LoadFromResourceName(HInstance, 'pie'); //ladataan resurssista
Image1.Picture.Bitmap := ResBMP; // Imageen
finally
ResBMP.Free; //Winkku hyytyy ennenpitkää jos...
end;
end;
Visuaalinen lotto-ohjelma joka käyttää satunnaislukugeneraattoria ja joukkojen
käyttöä (imuroi --> lotto.zip) Pieniä korjauksia --> päivitetty 26.3.2002
JPG-Kuva piirretään formille:
Tarkasta että uses rimpsussa on Graphics ja lisää sinne Jpeg
procedure TForm1.FormPaint(Sender: TObject); // Formin OnPaint:iin kirjoitat
var
Kuva : TPicture;
begin
Kuva := TPicture.Create;
try
Kuva.LoadFromFile('H:\web\WWWKUVAT\Delf.jpg'); // Vaihda polku!
Canvas.Draw(0,0, Kuva.Graphic); //*
finally
Kuva.Free;
end;
end;
//*Jos haluat venyttää kuvan formin mittoihin käytä tässä lausetta:
Canvas.StretchDraw(ClientRect, Kuva.Graphic);
//Huom: tästä seuraa että joudut lisäämään formin OnResize:een
procedure TForm1.FormResize(Sender: TObject);
begin
Repaint; //jos joku muuttaa formin kokoa, kuva uudelleen "maalataan". #@?$
end;
//Sovelluksen ohje on html muodossa Ohje kansiossa samassa paikassa kuin exe-tiedosto
//Kansiossa, sen takia kun on paljon kuvia ym. sälää, (siistimpää nääs).27.8.2001
//Ai niin, laita uses ripsuun ShellApi
begin
if FileExists(ExtractFilePath(Application.ExeName)+'Ohje\lotto.html') then //löytyykö?
begin
ShellExecute(Handle, nil,'Ohje\lotto.html', '', '', SW_SHOWNORMAL);//selaimeen
end
else
MessageDlg('Kansiota Ohje tai lotto.html:ää ei löydy !', mtInformation,[mbOk], 0);
end;
Delphi ohjelmasta käynnistetään cookiesveks.bat tiedosto joka tuhoaa paljon
keskustelua herättäneet keksit (cookies) Windowsin cookies kansiosta.
Tietenkin kyseessä oleva cookiesveks.bat pitää laittaa myös käynnistymään
koneen käynnistyessä (rivi Autoexec.bat:iin).
Samalla siihen voisi lisätä rivit index.dat tiedostojen poistamiseksi.
procedure TForm1.SpeedButton37Click(Sender: TObject);
var polku : Array[0..255] of Char;
begin
if FileExists(ExtractFilePath(Application.ExeName)+'APU\cookiesveks.bat') then
begin
StrPcopy(polku,ExtractFilePath(Application.ExeName)+'APU\cookiesveks.bat');
WinExec(polku,sw_ShowNormal);
end
else
MessageDlg('cookiesveks.bat:ia ei löydy', mtInformation,[mbOk], 0);
end;
cookiesveks.bat:in sisältö:
@echo off
c:
cd\windows\cookies
del *.txt
CLS
c:
cd\
Ihmiset jotka lukevat tai käyttävät toisten keksien tietoja "hyväkseen"
voivat pelata säästyneellä työajalla vaikkapa NENÄNKARVA TETRISTÄ:
Etusormella ja peukalolla otetaan tiukka pinsettiote nenänkarvoista...
raju riuhtaisu ja valoa vasten katsotaan montako karvaa lähti.
4 karvaa on tietysti "tetris".
Euromuunnin, joka muuttaa eurot markoiksi. Muunlaisia ei enää tarvitse?.
Laita pikakuvake tehtäväpalkkiin, niin muunnin on aina käsillä kun esim. surffaat
netissä. ( imuroi --> eurom.zip ) 178 kt. Päivitetty 17.5.2002.
Lisätty ominaisuus, jolla sovelluksen voi tiputtaa tehtäväpalkkiin Page Down napilla.
Lupaan kuukauden GURU-tittelin sille henkilölle, joka saa tehtäväpalkiin pienennetyn ohjelman
"heräämään henkiin". Tässä tapauksessa Page Up napilla.
// 9.12.2003
// Ohjelma pitäisi saada toimimaan näppäimistöltä.
// Valitse ensin pääformi...laita Object Inspectorissa KeyPreview ---Trueksi
// Kirjoita senjälkeen pääformin KeyDown tapahtumaan esim:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin //Formin KeyPreview ensin trueksi
if key = VK_INSERT then alku.Click;
if key = VK_DELETE then loppu.Click;
//jne...
end;
//Vihjetekstiäkin voi rivittää { Chr(13)= rivinvaihto } 29.12.2003
//vihjeteksti on laitettu pääformin FormGreateen
procedure TForm1.FormCreate(Sender: TObject);
begin
RB1.Hint := 'Ensimmäinen rivi' + Chr(13) + 'Toinen rivi';
//...
//...