![]() |
Zugriff auf Controls bringt Fehler Zugriffsverletzung
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:
Nun bekomme ich aber bei der Ausführung eben jener Codezeilen jedes Mal einen Fehler:
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; Zitat:
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??? |
AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung
Zitat:
Ein Soft-Cast ala
Delphi-Quellcode:
wird dir sofort als Compiler-Fehler um die Ohren gehauen und ich bin fast sicher, dass auch hier der Compiler mindestens eine Warnung anzeigen sollte.
('dbnHeim_S' + iSchuetze.ToString) as TDBNavigator
![]() |
AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung
Ooooo keeeeee... :?
Bin mit der Antwort leider immer noch etwas überfordert, aber verstehe auf was du hinaus willst. Ich habs jetzt mit der im letzten Codeschnipsel gezeigten Methode gemacht... Funktioniert auch. Trotzdem Danke! |
AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung
Es gibt nur einen "Unterschied".
Zitat:
und Parent ist die Koponente, wo deine Komponente drauf liegt. Liegt dein TDBNavigator z.B. in einem TPanel, dann findest du ihn in Self.Controls nicht mehr, da Self hier die Form ist und nicht das Panel. Innerhalb von Methoden der Form ist Self die Form selber, bzw. Self ist auch immer implizit da, auch wenn man es nicht explizit angibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz