Voor/van de absolute beginner Deel 3
In het volgende Deel 4 pak ik de ClientDataSet (database) bij de hoorns.
Maar nu eerst nog even de Form.
Ik wil dat je van Form naar Form kunt schakelen waarbij het voorgaande Form verdwijnt.
Behalve als je naar het Form Bericht gaat, want dan moet de aanroepende Form op de achtergrond blijven staan.
Verder mogen de Forms Test1, Test 2 en Test 3 op elke plek op het scherm verschijnen, maar het Form Bericht moet precies in het midden van het scherm.
Natuurlijk kan het ook anders.
Ik zou een voorgekookt berichtenvenster kunnen nemen uit de Delphi reeks, of zelfs de MS Windows messagebox kunnen gebruiken, maar het gaat mij hier om het aftasten van de mogelijkheden.
En tasten is vaak heel prettig.
Ik voeg een 4e Form toe.
File>New>Form
Dan meteen een .pas maken voor deze unit
File>Save as... c:\delphi-ben\Experiment\Bericht.pas
Let hierboven even op het pad. Ik vergeet zelf nog wel eens een letter en soms zelfs een gedeelte van het pad. Ik heb in de voorgaande artikelen al eens c:\delphi-ben\test1.dpr geschreven. Dat moet steeds c:\delphi-ben\experiment\test1.dpr zijn.
Schrijven van een lang artikel is net programmeren alleen de Debugger ontbreekt.
Even weer een uitstapje.
Als je plotseling besluit om een project te verplaatsen naar een andere map, dan doet ie het niet meer.
Zoek voor je het project opstart de .res file van het project en delete die file.
Als je nu je project runt dan wordt er een nieuwe .res gemaakt en hij doet het weer.
Maak nu de Caption van de nieuwe Form leeg.
De Form wil ik altijd in het midden van het scherm laten verschijnen.
ObjectInspector>Position>poDeskTopCentre
En ik wil dat de gebruiker niet aan dit venster kan veranderen.
ObjectInspector>Constraints, klik op "+" en voer de volgende waarden in voor de maximale en minimale hoogte en breedte, onderelkaar: 122, 162, 122 en weer 162.
Ik haal de knoppen minimaliseren en maximaliseren weg.
ObjectInspector>BorderIcons>klik op +
biSystemMenu >True
biMinimize >False
biMaximize >False
biHelp >False
Nu wil ik een speciale mooie OK knop plakken.
In de componentbalk klik tab Additional.
Klik de OKknop. de Hint van deze knop is BitBtn(Buttons).
Plaats de knop rechts onderin de Form.
Selecteer de knop.
ObjectInsoector>Caption OK
ObjectInspector>Glyps> dubbelklik de ellips>load
Ga naar c:\program files\common files\borland shared\images\buttons en load check.bmp >ok.
Als die check.bmp niet te vinden is in het pad hierboven dan moet je hem gaan zoeken met Verkenner, of in uiterste noodzaak Googlen.
Nu nog een Label.
Componentbalk>Standerd>A
Klik op die A en klik daarna bovenin de Form.
ObjectInspector>Alignment>taCentre
ObjectInspector>AutoSize>False
ObjectInspector>Caption leeg maken.
Deze 3 aanpassingen zorgen ervoor dat de tekst die later vanuit het programma in de Label geschreven wordt gecentreerd wordt.
En de volgende stap zorgt ervoor dat de tekst vet is.
ObjectInspector>Font +>Style +>fsBold>True (+ betekent "klik op het plusje")
Maak nu met slepen de Label bijna net zo breed als de Form.
In dit Label komen korte berichten te staan.
Width 184 is zo ongeveer (op de pixel nauwkeurig) de breedte.
Op de Form Test 1, Form Test 2, en op de Form Test 3, plak ik nu knoppen (Buttons) onder de al aanwezige.
Deze nieuwe knoppen geef ik dezelfde afmetingen als de andere.
De nieuwe knoppen krijgen allemaal de Caption "Bericht".
Ik ga programmeren.
Ik pas eerst de regel aan na "uses".
De unit Bericht moet toegevoegd worden.
In alle 3 Test Forms gaat dit toevoegen hetzelfde, namelijk zo:
Delphi Code:
uses TestF2, TestF3, Bericht; // Welke Units er gebruikt worden
In Unit Bericht komt deze regel onder een lege regel onder het woord implementation
Delphi Code:
implementation
uses Test1Unit1, Test2Unit2, Test3Unit3;
Ik moet aan Form Bericht laten weten welke Form heeft aangeroepen.
Immers alle Forms (Test 1, Test 2, test 3) hebben nu een knop Bericht.
Ik heb dus een globale variabele nodig.
Die komt alleen in Test1Unit1.
Ik noem die FmNr. Klik in de editor de tab Test1Unit1
Voor alle duidelijkheid ook de code er omheen.
Delphi Code:
var
Form1: TForm1;
FmNr:Integer; // Global variabele die aangeeft welke Form het Bericht heeft aangeroepen
implementation
uses TestF2, TestF3, Bericht; // Welke Units er gebruikt worden
Nu nog een gebeurtenis (event) uitwerken als er op de knop Bericht wordt geklikt.
Ga naar Form Test 1.
Dubbelklik de knop Bericht.
En schrijf deze regels.
Delphi Code:
procedure TForm1.Button3Click(Sender: TObject); // Bericht
begin
FmNr:=1; // Form1 geeft 1 aan de variabele FmNr, Form2 geeft 2, Form3 geeft 3
Form1.Enabled:=False; // Form1 zichtbaar maar uitgeschakeld
Form4.Show; // Bericht wordt getoond
Form4.Caption:='Bericht';
Form4.Label1.Caption:='Terug naar Form1'
end;
Even tussendoor: hier staan veel te veel verklarende teksten. Ik gebruik die alleen maar tijdens een leerfase. Later kan die hoeveelheid tekst drastisch verminderd worden. Beter is om alleen boven de procedure/functie tekst te zetten om jezelf, of een andere programmeur, te vertellen wat er gaat gebeuren.
Dubbelklik in de Form Test 2 op de knop Bericht en codeer:
Delphi Code:
procedure TForm2.Button3Click(Sender: TObject);
begin
FmNr:=2; // Bericht wordt aangeroepen en Unit Bericht moet dus terug kunnen keren naar Form2
Form2.Enabled:=False; // Form2 wordt uitgeschakeld
Form4.Show; // Bericht wordt getoond
Form4.Caption:='Informatie';
Form4.Label1.Caption:='Terug naar Form2' // tekst in bericht
end;
Nu nog een keer voor de knop Bericht in Form Test 3.
Delphi Code:
procedure TForm3.Button3Click(Sender: TObject);
begin
FmNr:=3;
Form3.Enabled:=False;
Form4.Show;
Form4.Caption:='Waarschuwing!';
Form4.Label1.Caption:='Terug naar Form3'
end;
En dan moet de knop OK in Form Bericht nog wat doen.
De "Case of" wordt hier gebruikt in plaats van "If Then Else" omdat dat netter is en nog wat meer mooie argumenten.
Je ziet dat de globale variabel FmNr nu gebruikt wordt om naar het juiste venster terug te keren.
Dubbelklik die knop en codeer:
Delphi Code:
// OK button
{ In de Form Events OnHide wordt deze procedure ook aangeroepen. Nu wordt dus niet
OnClose gebruikt, omdat we het programma nu NIET willen beeindigen
}
procedure TForm4.BitBtn1Click(Sender: TObject);
begin
Form4.Hide;
Case FmNr of
1:
begin
Form1.Enabled:=True;
Form1.Show
end;
2:
begin
Form2.Enabled:=True;
Form2.Show
end;
3:
Begin
Form3.Enabled:=True;
Form3.Show
end;
end;
end;
En als ik dacht klaar te zijn, bedenk ik wat er zou gebeuren als ik in het Form Bericht op de kruis klik?
Volg dit pad:
klik in Form Bericht op de knop OK.
ObjectInspector>tab Events>OnHide>klik in het lege venster en kies dan Btn1Click.
Nu zal ongeacht hoe de Form Bericht gesloten wordt de OnClick event uitgevoerd worden.
Ik doe mijn uiterste best geen typefouten te maken, maar mijn kijkdebugger kan mijn vingerbugger niet bijhouden.
Ik heb deze bovenstaande code opnieuw volgens de leidraad in dit artikel gemaakt en bij mij werkt alles prima.
Tot gauw,
Ben
Bookmarks