Servus zusammen,
habe hier ein kleines Problem, bei dem ich im Moment nicht ganz weiß, wo der Fehler liegt.
Ich bin gerade dabei eine Wettkampfverwaltung für einen Sportverein zu programmieren und habe an einer Stelle ein merkwürdiges Problem.
Ich möchte auf meine Controls "dynamisch" zugreifen. Heißt, ich habe Daten, die nacheinander in verschiedene Datenbanktabellen gepspeichert werden sollen.
Zuerst habe ich es auf diese Weise versucht, die auch wunderbar funktioniert hat:
Delphi-Quellcode:
if Rundenkampf.Heim[1].Name_Vorname <> '' then begin
dbnHeim_S1.BtnClick(nbInsert);
// Ausweis, Name
Rk_heim_s1_detailTableAusweis.Value := Rundenkampf.Heim[1].Ausweis;
Rk_heim_s1_detailTableName_Vorname.Value := Rundenkampf.Heim[1].Name_Vorname;
// Scheibennummern
Rk_heim_s1_detailTableScheibe_von.Value := Rundenkampf.Heim[1].Scheibe_Von;
Rk_heim_s1_detailTableScheibe_bis.Value := Rundenkampf.Heim[1].Scheibe_Bis;
// Einzelschüsse
Rk_heim_s1_detailTableSchuss_1.Value := Rundenkampf.Heim[1].Schuss[1];
Rk_heim_s1_detailTableSchuss_2.Value := Rundenkampf.Heim[1].Schuss[2];
Rk_heim_s1_detailTableSchuss_3.Value := Rundenkampf.Heim[1].Schuss[3];
Rk_heim_s1_detailTableSchuss_4.Value := Rundenkampf.Heim[1].Schuss[4];
Da der Programmierer an sich ja ein recht faules Exemplar Mensch ist, dachte ich mir, ich pack das in ne Schleife und muss es nicht 20 mal in meinen Quelltext aufnehmen.
Das sieht dann so aus:
Delphi-Quellcode:
for iSchuetze := 1 to 10 do begin
if Rundenkampf.Heim[iSchuetze].Name_Vorname <> '' then begin
TDBNavigator('dbnHeim_S' + iSchuetze.ToString).BtnClick(nbInsert);
// Ausweis, Name
TIntegerField('Rk_Heim_s' + iSchuetze.ToString + '_detailTableAusweis').Value := Rundenkampf.Heim[iSchuetze].Ausweis;
TWideStringField('Rk_Heim_s' + iSchuetze.ToString + '_detailTableName_Vorname').Value := Rundenkampf.Heim[iSchuetze].Name_Vorname;
// Scheibennummern
TIntegerField('Rk_Heim_s' + iSchuetze.ToString + '_detailTableScheibe_von').Value := Rundenkampf.Heim[iSchuetze].Scheibe_Von;
TIntegerField('Rk_Heim_s' + iSchuetze.ToString + '_detailTableScheibe_bis').Value := Rundenkampf.Heim[iSchuetze].Scheibe_Bis;
// Einzelschüsse
for iSchuss := 1 to 40 do begin
TFloatField('Rk_Heim_s' + iSchuetze.ToString + '_detailTableSchuss_' + iSchuss.ToString).Value := Rundenkampf.Heim[iSchuetze].Schuss[iSchuss];
end;
Nun bekomme ich aber bei der Ausführung eben jener Codezeilen jedes Mal einen Fehler:
Zitat:
"Zugriffsverletzung bei Adresse xxxx in Modul YYYY. Lesen von Adresse ZZZZ."
Habe mit Breakpoints gesetzt und hab bereits herausgefunden, dass es mit beim ersten DBNavigator schon diese Zugriffsverletzung im die Ohren haut.
Ist die Vorgehensweise beim Ansprechen der Controls denn so richtig? Gemeckert hat der Compiler noch nicht beim Übersetzen.
Irgendwer ne Idee?
Noch ne Ergänzung:
Wenn ich es so mache, dann funktionierts.
Delphi-Quellcode:
for iSchuetze := 1 to 10 do begin
if Rundenkampf.Heim[iSchuetze].Name_Vorname <> '' then begin
for Komponente := 0 to ControlCount - 1 do begin
// Ausweis, Name
if Controls[Komponente].Name = 'dbnHeim_S' + iSchuetze.ToString then begin
TDBNavigator(Controls[Komponente]).BtnClick(nbInsert);
end;
end;
end;
end;
Kann ich die Controls nicht per THierControlnameEinfügen('Controlname') ansprechen???