Jeg må indrømme at jeg ikke kan se den store idé i at loade an XML-fil ind i en TDBGrid først. Nu sidder jeg desværre ikke ved en computer med Delphi på, men jeg ville nok løse problemet nogenlunde således:
Der skal bruges en TRadioGroup til svarmulighederne og en TXMLDocument til at læse XML-filen med.
Jeg forestiller mig at XML-filen vil se nogenlunde sådanne ud:
<?xml version="1.0" standalone='yes' ?>
<questions>
<question qst="Hvad er bedst?">
<answer correct="1">Delphi</answer>
<answer correct="0">C++</answer>
<answer correct="0">JAVA</answer>
<answer correct="0">C#</answer>
</question>
.
.
.
</questions>
Din TXMLDocument sættes til at pege på XML-filen og autoopen* skal sættes til true.
Nu er det at jeg mangler min Delphi-dokumentation da jeg ikke kan huske de korrekte navne på properties i TXMLDocument så jeg skriver muligvis de forkerte navne. Du bør tjekke med dokumentationen for at finde de rigtige navne.
Du skal have en IXMLNode til at pege på XML-filens rod (<questions>
.
var DocumentRoot: IXMLNode;
...
begin
DocumentRoot := XMLDocument.DocumentElement;
...
DocumentRoot giver dig nu let tilgang til alle dens 'børn' og jeg må her igen henvise til dokumentationen for yderligere detaljer.
Grundidéen er dog at du kan få adgang til et hvilket som helst 'barn' med ChildNodes som fungerer ligesom en array.
var Question: IXMLNode;
...
begin
//Sætter Question til at pege på det første (0'te) spørgsmål i XML-filen
Question := DocumentRoot.ChildNodes[0];
//sætter første 'option' til første svarmulighed
RadioGroup.Items[0] := Question.ChildNodes[0].Text;
...
RadioGroup.Items[3] := Question.ChildNodes[3].Text;
Når brugeren har svaret vil du blot tjekke om den angivne <answer> har attributten correct = '1'.
if Question.ChildNodes[RadioGroup.ItemIndex].Attribute['correct'] = '1' then
correct
else
false;
Dette burde overordnet være nok til at kunne få dig i gang. Der mangler selvfølgelig noget med at vælge og arrangere spørgsmålene tilfældigt, men det vil jeg lade dig ordne. Et muligt vink er dog at du kunne tilføje en attribut i root-elementet som fortæller hvor mange spørgsmål der er (hvis dette ikke allerede findes i IXMLNode).
Som sagt er navnene dog med stor sandsynlighed ikke korrekte så du må tjekke dokumentationen for at finde de rigtige kald.