Astronomie · PalmOS software · Roosteren · Informatica · Windows software · Natuurkunde · Wiskunde · Meteorologie · Fietsen · Diversen

Informatica

Algemeen
lesmateriaal 4H/4V
lesmateriaal 5V/5H
lesmateriaal 5H/6V
lesmateriaal: Verdie
PO: Programmeren
PO: Projecten
PO: Werkstukken
PO: CT
PO: Afgerond
tips: Algemeen
tips: Delphi
tips: Delphi (2)
tips: Logo
tips: NSBasic
tips: OpenOffice
links: Software
links: websites
cc: Voorlopig
cc: Voorlichting
cc: Lokaalgeboden
cc: Excursies
cc: Puzzels
Haiti
tips: Small Basic
PO: Programmeren2008
PO: Programmeren2009
PO: Programmeren2010
PO: Programmeren2011
Gamemaker

Delphi tips (2)

 

 

Op deze pagina vind je tips voor de programmeertaal Delphi.

 

Meer TIPS vind je bij deze website, of hier, of hier.

 

 

23 oktober 2013

TIP 36: Het aantal items in een listbox opvragen

Het aantal items in een listbox is op te vragen met:

 

aantal := listbox1.items.count;

 

Dat aantal is een geheel getal. Als je het in een label wilt weergeven gebruik je:

 

label1.caption:=IntToStr(listbox1.items.count);

 

 

 

23 oktober 2013

TIP 35: Bepalen of een tekst ergens in een string staat

 

Als je alleen wilt weten of een tekst gelijk is aan een andere tekst gebruik je het is-teken

 

dier:='aap';

keuze:='konijn';

if keuze=dier then begin

  showmessage('Je keuze is geen aap');

  end

else begin

  showmessage('Je hebt de aap gekozen');

  end;

 

Als je wilt weten een een tekst ergens in een string staat gebruik je pos.

Pos geeft de positie aan. Als de tekst nergens staat is de positie 0.

 

Het volgende voorbeeld zet de waarde 4 in p:

 

p:=pos('aap','de aap slingert in de boom');

 

Het volgende voorbeeld zet 0 in p:

 

p:=pos('konijn','de aap slingert in de boom');

 

Je kunt pos ook met variabelen gebruiken:

 

zin := edit1.text;

zoektekst := edit2.text;

p:=pos(zoektekst,zin);

If p=0 then begin

  label1.caption := 'Het woord staat niet in de zin';

  end

else begin

  label1.caption:='Het woord staat op positie '+inttostr(p)+'.';

  end;

 

 

Als het woord meer dan één keer in de tekst staat kun je met een lus verder zoeken, tot het niet meer gevonden wordt (p=0!).

Het principe is dan dat je steeds de staart, rechts van het gevonden woord gebruikt voor de volgende zoekstap:

 

woord:=edit1.text;

zin:=edit2.text;

 

// staat het woord in de zin?

p:=pos(woord,zin);

while p>0 do begin

  // het woord is gevonden op positie p

 

  // .. doe hier iets

 

  // neem de staart van de zin, zet erop dat je met een kopie werkt

  // de originele zin is na deze opdracht niet meer compleet.

 

  zin := copy(zin, p+length(woord), length(zin)-p-length(woord));

 

  // kijk of het woord in de staart (staat nu in de variabele zin) voorkomt

 

  p:=pos(woord,zin);

  end;

 

 

 

13 september 2012

TIP 34: Bepalen of een form volledig zichtbaar is

 

Met de volgende functies kun je bepalen of een form volledig zichtbaar is.

Meestal moet het venster zichtbaar gemaakt worden als dat niet het geval is.

Dat kan met Form.SetFocus

 

function IsMyFormCovered(const MyForm: TForm): Boolean;
var
   
MyRect: TRect;
   
MyRgn, TempRgn: HRGN;
   
RType: Integer;
   hw
: HWND;
begin
 
MyRect := MyForm.BoundsRect;            // screen coordinates
 
MyRgn := CreateRectRgnIndirect(MyRect); // MyForm not overlapped region
  hw
:= GetTopWindow(0);                  // currently examined topwindow
 
RType := SIMPLEREGION;                  // MyRgn type

// From topmost window downto MyForm, build the not overlapped portion of MyForm
 
while (hw<>0) and (hw <> MyForm.handle) and (RType <> NULLREGION) do
 
begin
   
// nothing to do if hidden window
   
if IsWindowVisible(hw) then
   
begin
     
GetWindowRect(hw, MyRect);
     
TempRgn := CreateRectRgnIndirect(MyRect);// currently examined window region
     
RType := CombineRgn(MyRgn, MyRgn, TempRgn, RGN_DIFF); // diff intersect
     
DeleteObject( TempRgn );
   
end; {if}
   
if RType <> NULLREGION then // there's a remaining portion
      hw
:= GetNextWindow(hw, GW_HWNDNEXT);
 
end; {while}

 
DeleteObject(MyRgn);
 
Result := RType = NULLREGION;
end;

function IsMyFormVisible(const MyForm : TForm): Boolean;
begin
 
Result:= MyForm.visible and
           isWindowVisible
(MyForm.Handle) and
           
not IsMyFormCovered(MyForm);
end;

 

3 februari 2011

Tip 33: De Desktopachtergrond (Wallpaper) veranderen

procedure TForm1.Button1Click(Sender: TObject);
var
  PicPath: String;
begin
  PicPath := 'C:\WINNT\Prairie Wind.bmp';
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pChar(PicPath), SPIF_SENDCHANGE)
end;


Met de volgende code kun je de achtergrond ook als Tiles tonen:

 

uses Windows, SysUtils;

procedure SetWallpaper(const Filename: TFilename; Tiled: boolean);
var
  sTiled: string;
begin
  if Filename <> '' then begin
    if tiled then sTiled := '1' else sTiled := '0';
    SetRegistryData(HKEY_CURRENT_USER, '\Control Panel\Desktop',
      'TileWallpaper', rdString, sTiled);
  end;
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
    Pointer(Filename), SPIF_UPDATEINIFILE);
end;

 

 

 

3 februari 2011

Tip 32: GIF-afbeeldingen en animatie maken

Standaard heeft Delphi niet de mogelijkheid om GIF-animaties te maken.

Gelukkig zijn er units geprogrammeerd die dat eenvoudig mogelijk maken.

 

Bijvoorbeeld hier of hier.

 

Gebruik deze code als het je alleen om het inlezen van een GIF gaat.

 

1 februari 2011

Tip 31: De positie van de muis detecteren

Met GetCursorPos() kun je de positie uitlezen. in P.X en P.Y staan de x- en y-coordinaat.

 

var
  P: TPoint;
begin
  GetCursorPos(P);
  yourPopupMenu.Popup(P.X, P.Y);
end;

 

1 februari 2011

Tip 30: Veranderingen in een directory detecteren

Op deze website kun je een unit vinden waarmee je wijzigingen in een directory kunt detecteren. Wellicht is deze code ook nog bruikbaar. Ook op deze pagina staat bij Changes wellicht nog bruikbare code.

 

1 februari 2011

Tip 29: File in use

Met deze funcie kun je controleren of er op dat ogenblik naar een bepaald bestand geschreven wordt:

 

function TForm1.FileInUse(FileName: string): Boolean;
var hFileRes: HFILE;
begin
Result := False;
if not FileExists(FileName) then exit;
hFileRes := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
Result := (hFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(hFileRes);
end;

 

5 januari 2010

TIP 28: StringGrid

Met een TStringGrid maak je eenvoudig een tabel in je Delphi-programma.

 

Voeg de component aan de Form toe en stel RowCount en ColCount in.

Je kunt dat ook met programmacode doen:

 

   StringGrid1.RowCount:=10;

   StringGrid1.ColCount:=10;

 

Daarna kun je cel met een bepaalde waarde vullen:

 

    StringGrid1.Cells[2,3]:='ABC';

 

De rij- en kolomnummers beginnen bij 0. De cel linksboven is StringGrid1.Cells[0,0].

 

Meestal zul je een rij of een kolom vullen met een lus; bijvoorbeeld een for-lus.

 

Als je wilt dat de gebruiker in de tabel kan type moet je dat aanzetten bij de opties:

 

  goEdit:=true;

 

Je kunt ook controleren of er een bepaalde waarde in een cell ingevoerd is:

 

 

  if StringGrid1.cells[2,3]<>'ABC' then

    showmessage('Je hebt iets veranderd aan cel (2,3)');

 

 

3 januari 2010

TIP 27: Kleuren in Delphi

 

 

Conversie van RGB naar HSV

 

Conversie tussen RGB en Hex-waarden (zoals die in HTML gebruikt worden).

 

 

 

TIP 26: Een folder selecteren

 

Voeg bij uses het volgende toe:

 

uses ShellAPI, ShlObj;

Voeg de volgende functie toe:

 

function BrowseDialog(const Title: string; const Flag: integer): string;
var
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  Result:='';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  with BrowseInfo do begin
    hwndOwner := Application.Handle;
    pszDisplayName := @DisplayName;
    lpszTitle := PChar(Title);
    ulFlags := Flag;
  end;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  if lpItemId <> nil then begin
    SHGetPathFromIDList(lpItemID, TempPath);
    Result := TempPath;
    GlobalFreePtr(lpItemID);
  end;
end;

Title is de titel die bovenin het venster gezet wordt.

Flag kan zijn BIF_RETURNONLYFSDIRS, BIF_BROWSEINCLUDEFILES, BIF_BROWSEFORCOMPUTER of BIF_BROWSEFORPRINTER.

 

Zie ook deze website.

 

 

 

TIP 25: Een bestand afdrukken

Als je programma een bestand moet kunnen afdrukken kan dat! Vrij eenvoudig zelfs.

 

Lees meer in deze Engelstalige uitleg van Zarko.

 

 

TIP 24: Afhandelen van antwoorden van MessageDlg

 

Bij MessageDlg kun je de gebruiker uit 1 of meer antwoorden laten kiezen door die betreffende knoppen op te geven. Hieronder kun je zien hoe je afhankelijk van het antwoord een bepaalde bewerking kunt uitvoeren.

In dit voorbeeld wordt alleen een showmessage uitgevoerd, in een echt programma zal er een zinvollere opdracht op die plaats staan.

 

note: een leerzaam artikel over messageDlg vind je hier (wat gebeurt er als de gebruiker op het kruisje klikt? Antwoord: modalResult=mrCancel).

 

var res:Word;
begin
  res:=MessageDlg('Wil je het bestand bewaren?',mtConfirmation,[mbYes,mbNo,mbCancel],0);
  case res of

  mrYes    : begin
               showmessage('Het bestand wordt bewaard...');
               end;
  mrNo     : begin
               showmessage('Het bestand wordt NIET bewaard...');
               end;
  mrCancel : begin
               showmessage('De bewerking wordt afgebroken.');
               end;
  end;

 

TIP 23: Bestanden met een bepaalde naam zoeken

 

Op deze website geeft goede (Engelstalige) uitleg over hoe je een programma bestanden kunt laten zoeken. Deze routine zet de gevonden bestanden in een listbox.

Uitgebreidere code (die ook subdirectories doorzoekt) vind je op de genoemde website.

 

procedure FileSearch(const PathName, FileName : string) ;
var Rec : TSearchRec;
     Path : string;
begin
  Path := IncludeTrailingPathDelimiter(PathName) ;
  if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
  try
   repeat
      ListBox1.Items.Add(Path + Rec.Name) ;
   until FindNext(Rec) <> 0;
  finally
   FindClose(Rec) ;
  end;
  ...
  {all the code, particularly recursive
  function call can be found (downloaded) in
  the project source code}
  ...
end;

 

 

TIP 22: Een memo afdrukken

 

Met de zoekopdracht "delphi memo print" zijn verschillende tips te vinden over het afdrukken van een memo (meer Memo-tips staan hier).

 

uses printers;

procedure TForm1.PrintIt(Sender: TObject) ;
var
   PrintBuf: TextFile;
j : integer;
begin
   AssignPrn(PrintBuf) ;
   Rewrite(PrintBuf) ;
   try
     for j := 0 to Memo1.Lines.Count-1 do
       WriteLn(PrintBuf, Memo1.Lines[j]) ;
   finally
     CloseFile(PrintBuf) ;
   end;
end;

 

Een andere manier is:

 

procedure PrintTStrings(Lst : TStrings) ;
var
  I,
  Line : Integer;
begin
  I := 0;
  Line := 0 ;
  Printer.BeginDoc ;
  for I := 0 to Lst.Count - 1 do begin
    Printer.Canvas.TextOut(0, Line, Lst[I]);

    {Font.Height is calculated as -Font.Size * 72 / Font.PixelsPerInch which returns
     a negative number. So Abs() is applied to the Height to make it a non-negative
     value}
    Line := Line + Abs(Printer.Canvas.Font.Height);
    if (Line >= Printer.PageHeight) then
      Printer.NewPage;
  end;
  Printer.EndDoc;
end;

 

 

 

TIP 21: Woordafspreken van een Memo aan/uitzetten met een menu

 

Stel het menu-item heet Woordafbreken1. In het click-event van het menu-iem schrijf je:

 

Woordafbreken1.checked:=Woordafbreken1.checked XOR True;

Memo1.WordWrap:=Woordafbreken1.checked;

 

Let op: als je Scrollbars laat zien moet je die uitzetten als je woordafbreken aan hebt staan (anders gebeurd er niets).

 

TIP 20a: Een tekstbestand inlezen met behulp van een openDialog

 

if openDialog1.Execute Then begin

  Memo1.Lines.LoadFromFile(openDialog1.Filename);

  End;

 

TIP 20b: Een tekstbestand bewaren met behulp van een saveDialog

 

if saveDialog1.Execute Then begin

  Memo1.Lines.SaveToFile(saveDialog1.Filename);

  End;

 

TIP 19: Memo en Richedit helemaal leegmaken

 

Als je een memo of RichEdit in een project gebruikt is dat niet helemaal leeg: de naam van de component staat erin. Dit kun je dit alsvolgt weghalen:

 

  • selecteer de component
  • kies bij de properties lines
  • klik op de ...
  • er opent zich een venster waar je de tekst kunt weghalen
  • klik op Ok
  • klaar

 

TIP 18: Replace

 

   // vervangt old door new in de string s

   // bv.: replace(s, 'oud', 'nieuw');

  procedure Replace(var s:string;old,new:string);
  var p:integer;
  begin
    p:=pos(old,s);
    if p>0 then begin
      s:=copy(s,1,p-1)+new+copy(s,p+length(old),length(s)-p-length(old));


      end;
    End;

 

 

TIP 17: Een komma-gescheiden-string in losse delen splitsen

 

In een tekstbestand staan regel. Die zijn in te lezen zoals je bij tip 12 kunt lezen.

Als deze regels kommagescheiden data bevat zou je die willen scheiden.

 

In een regel staat bijvoorbeeld: hond,vis,kat,muis

 

Dus s:='hond,vis,kat,muis'

 

We gaan deze regel in losse items scheiden door met pos naar komma's te zoeken.

Pos geeft de positie van de eerst komma (van links gerekend).

In dit voorbeeld geeft de opdracht pos(',',s) dus als antwoord: 5.

Als er geen komma te vinden is, is het antwoord nul.

 

De opdracht copy geeft een deel van een string.

Met dezelfde string s als hierboven geeft copy de volgende antwoorden:

 

 

copy(s,1,4)='hond'

copy(s,5,4)=',vis'  (let op de komma)

 

De opdracht length geeft de lengte van een string. Dus in dit geval:

 

length(s)=17

 

In de volgende code kun je zien hoe je dit alles samenvoegt om de items één voor één uit de string te halen.

 

 

readln(f,s);

p:=pos(',',s);

while p>0 do begin

  // zet de tekens links van de komma in t

  t:=copy(s,1,p-1)

  // doe iets met t

  showmessage(t);

 

  // haal het linkerdeel van s weg

  s:=copy(s,p+1,length(s)-p);

 

  p:=pos(',',s);

  end;

 

// nu staan er geen komma's meer, maar misschien is s toch niet leeg

if s<>''  then begin

  showmessage(s);

  end;

 

In plaats van showmessage() kun je de string bijvoorbeeld ook in een memo zetten met memo1.lines.add(s).

Als je een array van strings aanmaakt kun je de items één voor één aan het array toevoegen:

 

woord[teller]:=s;

teller:=teller+1;

 

Je moet je teller natuurlijk wel steeds met één ophogen!

 

Het voordeel van de bovenstaande code is dat je het gemakkelijk kunt aanpassen voor andere scheidingsteken (een puntkomma of een spatie).

Het scheidingsteken zelf mag natuurlijk nooit in een item zelf voorkomen!

 

var sl:TStringList;

     i:integer;

     s:string;

begin

  sl:=TStringList.create;

  sl.commaText:=s;

  for i:=0 to sl.count-1 do begin

    showmessage(sl[i]);

    end;

 

  sl.Destroy;

end;

 

20100105: Als een tabgescheiden tabgescheiden tabel alleen maar in de stringgrid wilt inlezen kan dat eenvoudig op deze manier.

 

 

 

TIP 16: een form fullscreen maken

 

With Form1 Do Begin

  left:=0;

  top:=0;

  width:=screen.width;

  height:=screen.height;

  borderstyle:=bsNone;

  End;

 

Als je deze vijf variabelen eerst ergens bewaard kun je het scherm daarna weer in precies hetzelfde formaat herstellen.

Je kunt ook gewoon wat standaardwaarden instellen:

 

With Form1 Do Begin

  left:=50;

  top:=50;

  width:=200;

  height:=150;

  borderstyle:=bsSingle;

  End;

 

 

 

TIP 15: Afronden op x decimalen

(te gebruiken bij de Quetelet-berekening)

Delphi heeft aparte functies om af te ronden naar een geheel getal.

 

Afronden op 1 decimaal gaat bijvoorbeeld zo:

 

uitkomst := round(getal*10)/10;

 

Om af te ronden op twee decimalen neem je in beide gevallen 100 als factor. Je kunt op deze manier ook een functie maken die op een in te stellen aantal decimalen kan afronden:

 

function RondAf(getal:double; decimalen:integer):double;

var i,factor:integer;

 

begin

  factor:=1;

  for i:=1 to decimalen do

    factor:=factor*10;

 

  RondAf:=Round(getal*factor)/factor;

 

end;

 

 

 

 

TIP 14: Correct bewaren van een project

Het is het veiligste als je alle bestanden van een project in 1 map bij elkaar bewaard.

 

Bij een nieuw project kun het beste als volgt te werk gaan:

- maak een nieuw map; bijvoorbeeld 'MijnProgramma'

- start Delphi en maak een nieuw project aan.

- bewaar alle bestanden in de map 'MijnProgramma'. Bij een nieuw project zijn dat Project.dpr en unit1.pas.

- Als je Delphi afsluit zul je deze twee bestanden (en nog een paar andere bestanden in de map terugvinden).

 

Voor elke venster dat je daarna aanmaakt zul je een unit2.pas, unit3.pas etc. in dezelfde map moeten bewaren.

Als je dat vergeet ben je het werk aan dat venster natuurlijk kwijt. Let er op dat je bij het opslaan echt de juiste map kiest!

 

Vaak is het goed om na een tijdje een kopie van de map te maken. Doe dat nooit terwijl je met Delphi bezig bent!

 

- Maak een kopie van de map 'MijnProgramma', noem die bijvoorbeeld 'MijnProgramma versie 2'.

- start daarna Delphi en open het project in de nieuwe map. Gebruik dus niet de link bij de Recente Projecten

 

TIP 13: Try-Except

(bijvoorbeeld te gebruiken bij de Rekenmachine)

Met een Try-Except constructie kun je er een Delphi programma laten proberen om een stukje code uit te voeren. Als dat niet lukt voert het een ander programmadeel uit.

 

try

// probeer om de invoer in edit1 in een

// kommagetal om te zetten

  s1:=edit1.text;

  x1:=StrToFloat(s1);

except

  showMessage('Vul eerst een getal in');

end;

 

Je kunt zo'n try-except blok ook genest gebruiken (dus een tweede blok binnen het eerste blok).

 

try

  s1:=edit1.text;

  x1:=StrToFloat(s1);

 

  try

    s2:=edit2.text;

    x2:=StrToFloat(s2);

 

  except

    // geef een melding over getal 2

    showMessage('Vul eerst een getal in bij het tweede invoerveld');

  end;

 

except

  // geef een melding over getal 1

  showMessage('Vul in eerst een getal in bij het eerste invoerveld');

end;

 

In het volgende voorbeeld wordt de conversie van string naar komma getal 'beveiligd' met try/except. Als de deling ook nog zo beveiligd zou worden (zodat deling door nul opgevangen wordt) is het compleet.

 

 s1 := Getal1Edit.Text;
 s2 := Getal2Edit.Text;

 try
   x1 := StrToFloat(s1);
   try
     x2 := StrToFloat(s2);

     x3 := x1 / x2;
     s3 := FloatToStr(x3);
     UitkomstEdit.Text := s3;


   except
     showmessage('Bij getal 2 is geen getal ingevoerd');

   end;

 except
   showmessage('Bij getal 1 is geen getal ingevoerd');
 end;

 

Een alternatieve manier werkt zó:

 

  if not TryStrToFloat(Edit1.Text,x1) then begin
     showmessage ('Voer een getal in bij Getal 1');

     end

  else begin

     // hier staat de code voor als het WEL lukt om edit1.text in een

     // getal om te zetten

     end;

 

 

 

 

TIP 12: Een tekst-bestand bewaren

 

Net als bij het inlezen zijn er ook verschillende manieren om data in een tekstbestand te schrijven. Wat de meest voor de handliggende manier is hangt weer van de situatie af. We gaan er vanuit dat de string bestandsnaam de naam van het in te lezen bestand bevat.

 

Een memo bewaren.

 

memo1.SaveToFile(Bestandsnaam);

 

In een StringList inlezen

 

var SL:TStringList;

SL:=TStringList.Create;

// vul de stringlist met iets

SL.add('voorbeeld');

SL.SaveToFile(Bestandsnaam);

 

Regel voor regel schrijven

 

var f:textFile;

assignFile(f,bestandsnaam);

rewrite(f);

 

  // de string-variabele s bevat de inhoud van een regel die

  // geschreven moet worden

  // in dit geval wordt er maar één regel geschreven

  // vaak is er een lus nodig (For, while, ...) om alle strings te    

  // schrijven

 

writeln(s)

end;

closeFile(f);

 

 

 

TIP11: Een tekst-bestand inlezen

 

Er zijn verschillende manieren om een tekstbestand in te lezen. Wat de meest voor de handliggende manier is hangt af van wat je met de inhoud van het tekstbestand wilt doen. We gaan er vanuit dat de string bestandsnaam de naam van het in te lezen bestand bevat.

 

In een memo inlezen (en bewerken).

De eerste methode is rechttoe rechtaan: de tekst komt meteen in een memo terecht.

 

memo1.LoadFromFile(Bestandsnaam);

 

In een StringList inlezen

De inhoud van de StringList is nergens te zien voor de gebruiker. Je kunt er dus (onzichtbaar voor de gebruiker) bewerkingen op los laten (de strings sorteren, een string toevoegen, etc).

 

var SL:TStringList;

SL:=TStringList.Create;

SL.LoadFromFile(Bestandsnaam);

 

Regel voor regel inlezen

De derde methode is het meest flexibel.

 

var f:textFile;

assignFile(f,bestandsnaam);

reset(f);

while not eof(f) do begin

  readln(f,s)

  // de stringvariabele s bevat nu de inhoud van een regel

 

  end;

closeFile(f);

 

 

 

 

TIP10: Lijst van rechthoeken

Het is niet mogelijk een TList te gebruiken voor een lijst van TRect's. Op de onderstaande manier met een dynamisch array gaat het wel.

 

type TPointList=array of Tpoint;
type TRectList=array of Trect;
... 
    var points:TPointList;
    var rects:TRectList;
...
    setlength( points,100 );
    setlength( rects, 10 );
    points[50]:=Point( 500,500 );
    points[2] := Point( 20,20 );
    rects[ 5] := Rectangle( 40,40,60,60 );
...

 

TIP9: Converteer een kleurwaarde naar een grijswaarde

function RgbToGray(Source: TColor) : TColor;
var Target: Byte;
begin
  Target := Round((0.30 * GetRValue(Source)) +
		(0.59 * GetGValue(Source)) +
		(0.11 * GetBValue(Source)));
  Result := RGB(Target, Target, Target);
end;

 

TIP8: De Bitmap van Image1 kopieren naar Image2

 

Image2.Canvas.CopyRect(
    Rect(0,0,Image2.Width,Image2.Height),
    Image1.Canvas,
    Rect(
      0,
      0,
      Image1.Picture.Width,
      Image1.Picture.Height));

 

TIP7: Een JPEG-afbeelding afbeelding in een Image component inlezen

De onderstaande code lees een JPEG afbeelding in een Image Component in. Doot het gebruik van Try/Catch/Finally is het wat gemakkelijker om fouten bij het inlezen af te vangen.

 

LET OP: Denk er aan dat je JPEG bij USES toevoegd! Zie ook TIP6. De OpenPictureDialog vind je op het tabblad Dialogs.

 

procedure TForm1.Button3Click(Sender: TObject);
var

  jpeg: TJpegImage;
  Bitmap  : TBitmap;
begin
  If OpenPictureDialog1.Execute Then Begin

    try
      jpeg := TjpegImage.Create;
      try
        jpeg.LoadFromFile(OpenPictureDialog1.FileName);
        Image1.Picture.Assign(jpeg);
      finally
       

      end;
    finally
    end;
  end;
end;

 

 

TIP6: Een JPEG-afbeelding converteren naar BMP

Met de onderstaande procedure converteer je een JPEG-afbeeldingen naar BMP.

 

LET OP:

 

Bij uses moet je opgeven dat je de JPEG Unit wilt gebruiken. De lijst bij USES ziet er dan bijvoorbeeld zo uit:

 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ExtCtrls
  ,
  jpeg
  ;

 

Nu volgt de procedure:

 

procedure ConvertJpegFileToBitmapFile(const SourceFilename, DestinationFilename: String);

var

jpeg: TJpegImage;

bmp: TBitmap;

begin

jpeg := TJpegImage.Create;

jpeg.LoadFromFile(SourceFilename);

bmp := TBitmap.Create;

bmp.Assign(jpeg);

bmp.SaveToFile(DestinationFilename);

bmp.Free;

jpeg.Free;

end;

 

 

 

 

TIP5: ListBox vullen en leegmaken

Een Listbox vullen gaat bijvoorbeeld met ListBox1.Items.Add(EenString);

Vanuit een bestand lees je een lijst in met ListBox1.Items.LoadFromFile(EenTekstFile);

Een ListBox leeg maken kan als volgt:

 

methode 1

// de volgende opdrachten hebben betrekking op ListBox1.Items

  with listbox1.Items do  

 

// zolang er meer dan 0 strings in Items zitten
    while count>0 do

 

// wis de eerste (de eerste string heeft index 0!)
      delete(0);

 

methode 2

// zorg dat er meer dan 1 item geselecteerd kan worden

  listbox1.MultiSelect:=true;

 

// selecteer alle strings
  listbox1.SelectAll;

 

// wis alle geselecteerde strings
  listbox1.DeleteSelected;

 

// zet MultiSelect weer uit
  listbox1.MultiSelect:=false;

 

TIP4: PaintBox of Image?

Zowel een TPaintbox als een TImage hebben een Canvas (tekengebied). Het voordeel van een Paintbox is, dat deze ook een OnPaint-event heeft. Alles wat je in een OnPaint programmeert, wordt uitgevoerd zodra Windows ontdekt dat (een deel van) de PaintBox opnieuw getekend moet worden. Dat is bijvoorbeeld het geval als er even een ander venster over de PaintBox lag.

 

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin

// schrijf hier de code om de Canvas van PaintBox1 opnieuw te tekenen

// denk er aan dat je vaak moet beginnen met de Canvas te wissen, dat

// gebeurd niet vanzelf! Zie ook tip2

end;

 

 

TIP3: Pijlen Tekenen

Een pijl bestaat uit een lijnstuk en twee pijlpunten (ook lijnstukken) die onder een bepaalde hoek aan het einde van het eerste lijnstuk zitten.

De coordinaten van het startpunt van het eerste lijnste noemen we (x0,y0), de coordinaten van het eindpunt (x1,y1).

De pijlpunten hebben een lengte PijlPuntLengte en zitten onder een hoek PijlPuntHoek aan het lijnstuk vast.

De pijl wordt getekend op een tekengebied (TCanvas). Een TCanvas zit bijvoorbeeld in een TPaintBox (component in het Tabblad System).

 

 

// lengte L in pixels, hoek H in graden

Procedure TekenPijl(C:TCanvas; x0,y0,x1,y1,L:integer; H:double);
var x2,y2:integer;
     x3,y3:integer;
     hoekInRadialen,
     hoek2:double;
Begin

  // reken de hoek om in radialen
  hoekInRadialen := H * pi / 180;

 

  // alle teken functies hebben betrekking op C

  with C Do Begin

 

  // teken het eerste lijnstuk
    MoveTo(x0,y0);
    LineTo(x1,y1);

 

// bereken de hoek die het eerste lijnstuk maakt met de x-as.

    hoek2:=arcTan2(y0-y1,x0-x1);

 

// bereken de coordinaten van het eindpunt van de eerste

// pijlpunt

 

    x2:=x1+round(lengte*cos(hoek2 + HoekInRadialen));
    y2:=y1+Round(lengte*sin(hoek2 + HoekInRadialen));

 

// teken de eerste pijlpunt

    MoveTo(x1,y1);
    LineTo(x2,y2);

 

// bereken de coordinaten van het eindpunt van de tweede

// pijlpunt

    x3:=x1+Round(lengte*cos(hoek2 - HoekInRadialen));
    y3:=y1+Round(lengte*sin(hoek2 - HoekInRadialen));

 

// teken de tweede pijlpunt

    MoveTo(x1,y1);
    LineTo(x3,y3);

 

    End;
End;

 

Je roept de procedure bijvoorbeeld op met:

 

     TekenPijl(paintBox1.Canvas,20,20,100,100,20,45);

  Download: voorbeeldprogramma PijlenTekenen

 

TIP2: een Canvas (tekengebied) wissen

Met de volgende procedure kun je een Canvas wissen (of beter gezegd vullen met de kleur en het patronnen dat ingesteld staat in Canvas.Brush.Color).

 

procedure TForm1.WisCanvas(C:TCanvas;w,h:integer);
Var R:TRect;
Begin
  R:=Rect(0,0,w,h);
  C.FillRect(R);
End;

 

Als je bijvoorbeeld de Canvas van PaintBox1 wilt wissen, doe je dat zo:

 

With PaintBox1 Do

  wisCanvas(Canvas, Width, Height);

 

 

 

TIP1: TRect gebruiken

Bij veel teken-functies wordt een rechthoek gebruikt. Rechthoeken kun je bewaren in het type TRect (Rect komt van Rectangle=rechthoek).

Je kunt een TRect de juiste waarde geven met de functie Rect.

 

var
  rechthoek : TRect;

begin
  // Geef de rechthoek een breedte van 60, hoogte 80 en zet de

  // linker bovenhoek op coordinaat (20,40)

  rechthoek := Rect(20, 40, 60, 80);