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';
//...
//...