AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Zugriff auf Controls bringt Fehler Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Controls bringt Fehler Zugriffsverletzung

Ein Thema von Hardy81 · begonnen am 27. Nov 2016 · letzter Beitrag vom 27. Nov 2016
Antwort Antwort
Hardy81

Registriert seit: 25. Nov 2016
7 Beiträge
 
#1

Zugriff auf Controls bringt Fehler Zugriffsverletzung

  Alt 27. Nov 2016, 16:02
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???

Geändert von Hardy81 (27. Nov 2016 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung

  Alt 27. Nov 2016, 16:42
Zitat:
TDBNavigator('dbnHeim_S' + iSchuetze.ToString).xxx
Das muss auch knallen, denn du castest einen Zeiger auf einen String in einen Objektzeiger.

Ein Soft-Cast ala ('dbnHeim_S' + iSchuetze.ToString) as TDBNavigator 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.

Delphi-Referenz durchsuchenFindComponent
$2B or not $2B
  Mit Zitat antworten Zitat
Hardy81

Registriert seit: 25. Nov 2016
7 Beiträge
 
#3

AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung

  Alt 27. Nov 2016, 16:58
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriff auf Controls bringt Fehler Zugriffsverletzung

  Alt 27. Nov 2016, 17:07
Es gibt nur einen "Unterschied".

Zitat:
Self.Controls -> Self.FindControl // die Parent-Beziehungen
Self.Components -> Self.FindComponent // die Owner-Bezieungen
Alle Komponenten im FormDesigner haben immer die Form als Owner
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.
$2B or not $2B

Geändert von himitsu (27. Nov 2016 um 17:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz