![]() |
Array of Checkboxen : Zugrifsverletzung
ich möchte mir einen installer schreiben, der die installation von meinem programmen automatisiert. dazu habe ich mit 30 checkboxen erstellt, welche sich in dem array checkbox befinden. wenn ich nun auswerten weill welche checkboxen angeklickt wurden bekommt ich immer nur eine fehlermeldung : Zugriffsverletzung.
hier ist der wuellcode, der die probleme macht -.-
Delphi-Quellcode:
var
i: integer; j : integer; begin for i := 0 to 29 do begin if checkbox[i].Checked = True then ausgewählte_programme[j] := checkbox[i].Caption; if ausgewählte_programme[j] <> '' then j := j +1; end; |
Re: Array of Checkboxen : Zugrifsverletzung
Irgendwann wirst du in der Schleife auf einen ungültigen Index des Arrays zugreifen.
Ich würde den Fehler hier:
Delphi-Quellcode:
vermuten.
if ausgewählte_programme[j] <> '' then j := j +1;
Hast du denn den Code schon mal debuggt und dir die Werte der Variablen angeguckt? |
Re: Array of Checkboxen : Zugrifsverletzung
Was ist denn ausgewählte_programme? Eine TStringlist? Ist diese auch groß genug?
P.S.: Willkommen in der DP :dp: |
Re: Array of Checkboxen : Zugrifsverletzung
Dazu ist J nicht initialisiert
p.s. Boolsche Werte nie auf True oder False abfragen : ![]() p.p.s : Strings zu einer Stringlist fügt man mit Add dazu |
Re: Array of Checkboxen : Zugrifsverletzung
ausgewählte_programme ist eine string array von 0 bis 30
ich habe es auch schon versucht zu debuggen. delphi macht es einige male bis es die fehlermeldung ausspuckt. ich poste hier einfach mal den gesamten quell code
Delphi-Quellcode:
dazu : start is die erste userform, die standartmäßig aufgerufen wird und form 1 ist die zweite userform die anschliessend angezeigt werden soll.
unit start;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls,ShellAPI, jpeg, GIFImg, tlhelp32, pngimage; type Tfrm_start = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; bt_weiter: TImage; bt_ende: TImage; Image6: TImage; Panel2: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure bt_weiterMouseEnter(Sender: TObject); procedure bt_weiterMouseLeave(Sender: TObject); procedure bt_endeMouseEnter(Sender: TObject); procedure bt_endeMouseLeave(Sender: TObject); procedure bt_endeClick(Sender: TObject); procedure bt_weiterClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var frm_start: Tfrm_start; quelle : string; ziel : string; txt : textfile; currentdir: string; bat : string; programme: array [0 .. 30] of string; leerzeile : integer; zeile: string; checkbox : Array of TCheckBox; left: integer; top : integer; j : integer; filenames: Array[0 .. 30] of string; ausgewählte_programme : array[0..30] of string; implementation uses progress; {$R *.dfm} procedure Tfrm_start.bt_weiterClick(Sender: TObject); var i: integer; j : integer; begin for i := 0 to 29 do begin if checkbox[i].Checked = True then ausgewählte_programme[j] := checkbox[i].Caption; if ausgewählte_programme[j] <> '' then j := j +1; end; form1.Show; end; procedure Tfrm_start.FormCreate(Sender: TObject); var i: integer; begin // die checkboxen erstellen SetLength(checkbox, 30); left := 16; top := 49; for i := 0 to 29 do begin if i = 0 then else if i mod 10 = 0 then left := left + 240; checkbox[i]:= Tcheckbox.Create(panel2); checkbox[i].parent := panel2; checkbox[i].Visible := False; checkbox[i].Left := left; checkbox[i].Top :=top + j*23; checkbox[i].width := 200; j := j+1; if j = 10 then j :=0 ; if j = 0 then top := 49; end; // verfügbare Programme auslesen i := 0; currentdir := GetCurrentDir; begin j := 0; AssignFile(txt,currentdir + '\data.txt'); Reset(txt); Readln(txt, zeile); Readln(txt, zeile); repeat Readln(txt, zeile); programme[i] := copy(zeile,15,length(zeile) - 15); if programme[i] = '' then leerzeile := leerzeile + 1 else filenames[i] := programme[i] + '.txt'; if programme[i] <> '' then checkbox[j].Caption := programme[i]; if programme[i] <> '' then checkbox[j].Visible := True ; i:=i+1; if checkbox[j].caption = '' then else j := j + 1; until (leerzeile = 3); CloseFile(txt); end; end; Dank schoneinmal für die schnellen Antworten auch wenn diese mir nicht weitergeholfen haben. |
Re: Array of Checkboxen : Zugrifsverletzung
Kennst du schon die Komponente CheckListBox auf der Palettenseite "Zusätzlich"?
Ich glaube damit kannst du sehr viel Arbeit sparen. |
Re: Array of Checkboxen : Zugrifsverletzung
Tu Dir und uns einmal einen Gefallen und rücke ordentlich ein, dann kann man das auch lesen. Und wie guinnes schon sagte, j ist nicht initialisiert.
Delphi-Quellcode:
Übrigens weisen die statischen Arrays 31 Elemente auf, aber das dynamische nur 30. Ist das Absicht?
procedure Tfrm_start.bt_weiterClick(Sender: TObject);
var i: integer; j : integer; begin j := Low(ausgewählte_programme); for i := 0 to 29 do begin if checkbox[i].Checked then ausgewählte_programme[j] := checkbox[i].Caption; if ausgewählte_programme[j] <> '' then j := j +1; end; form1.Show; end; |
Re: Array of Checkboxen : Zugrifsverletzung
Wie gesagt:
- J ist nicht initialisiert und hat somit einen Zufallswert. - Bitte nicht auf = True prüfen Außerdem: in welcher Zeile hast du die AV? |
Re: Array of Checkboxen : Zugrifsverletzung
ok das mit dem initialisieren is logisch. habe ich übernommen. Aber warum sollte man nicht auf = True prüfen?
Die AV hatte ich in dieser zeile :
Delphi-Quellcode:
Aber diese taucht nun nicht mehr auf.
if checkbox[i].Checked = True then ausgewählte_programme[j] := checkbox[i].Caption;
Anstatt desen ist mein array ausgewählte_programme nun leer o.O |
Re: Array of Checkboxen : Zugrifsverletzung
Schau Dir doch mal Beitrag #6 an.
Eine (oder mehrere) CheckListBox(en) könnte deinen Aufwand radikal vereinfachen! Bevor du nicht geprüft hast, ob CheckListBox für Dich in Frage kommt ist jede weitere Änderung an deinem Programm mehr oder weniger sinnlos. |
Re: Array of Checkboxen : Zugrifsverletzung
danke für den tipp und entschuldigung, dass ich ich nicht auf deinen voherigen beitrag geantwortet habe. leider passt diese komponent vom design her nicht in mein projekt. trotzdem noch einmal vielen dank !
|
Re: Array of Checkboxen : Zugrifsverletzung
Dann nimm doch statt des String-Arrays eine TStringlist.
|
Re: Array of Checkboxen : Zugrifsverletzung
ich denke in meinem fall ist eine tstringlsit nicht sinnvoll, weil ich wie man sehen kann, die verfügbaren programme aus einer datei auslese. Sinn meines Projektes ist es im zweiten schritt aus den textdateien der ausgewählten prgramme die kommandozeilenparameter für die silent installtion auszulesen und auszuführen. danach werde ich ein paar werte in der registrierung anpassen, sodass ich die installation der proramme automatisiere und nicht jedesmal eingreifen muss.
|
Re: Array of Checkboxen : Zugrifsverletzung
Zitat:
Zitat:
|
Re: Array of Checkboxen : Zugrifsverletzung
den link habe ich geöffnet. mir den text durchgelesen bin aber icht wirklich schlau draus geworden. trotzdem danke für den link und entschuldigung, dass ich es nicht geschrieben habe.
|
Re: Array of Checkboxen : Zugrifsverletzung
Zitat:
|
Re: Array of Checkboxen : Zugrifsverletzung
man soll ja nicht sehen, was da im hintergrund abläuft. ich muss nur irgendwie die programm namen abspeicher, sodass ich in der nächsten userform darauf zugreifen kann.
wenn ich hier etwas falsches sage, dann belehrt mich bitte eines besseren. ich bin noch anfänger ! |
Re: Array of Checkboxen : Zugrifsverletzung
Eine TStringlist sieht man nicht, die existiert lediglich im Speicher.
|
Re: Array of Checkboxen : Zugrifsverletzung
wie erstelle ich denn eine tstringlist? kannst du vlt ein beispiel ppsoten indem du eine erstellst und 2-3 werte hineinschreibst?
danke ! |
Re: Array of Checkboxen : Zugrifsverletzung
Delphi-Quellcode:
var
i: Integer; lst: TStringList; begin lst := TStringList.Create; try lst.LoadFromFile('c:\datei'); for i := 0 to lst.Count - 1 do ShowMessage(lst[i]); finally lst.Free; end; end; |
Re: Array of Checkboxen : Zugrifsverletzung
nun funktioniert es. VIELEN DANK an alle die einen Beitrag geschrieben haben !
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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