Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Array of Checkboxen : Zugrifsverletzung (https://www.delphipraxis.net/149525-array-checkboxen-zugrifsverletzung.html)

pokermaster2007 23. Mär 2010 14:29


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;

Luckie 23. Mär 2010 14:32

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:
if ausgewählte_programme[j] <> '' then j := j +1;
vermuten.

Hast du denn den Code schon mal debuggt und dir die Werte der Variablen angeguckt?

DeddyH 23. Mär 2010 14:32

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:

guinnes 23. Mär 2010 15:01

Re: Array of Checkboxen : Zugrifsverletzung
 
Dazu ist J nicht initialisiert

p.s. Boolsche Werte nie auf True oder False abfragen : http://www.delphi-treff.de/tutorials...oolean-werten/

p.p.s : Strings zu einer Stringlist fügt man mit Add dazu

pokermaster2007 23. Mär 2010 16:12

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:
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;
dazu : start is die erste userform, die standartmäßig aufgerufen wird und form 1 ist die zweite userform die anschliessend angezeigt werden soll.

Dank schoneinmal für die schnellen Antworten auch wenn diese mir nicht weitergeholfen haben.

shmia 23. Mär 2010 16:17

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.

DeddyH 23. Mär 2010 16:20

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:
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;
Übrigens weisen die statischen Arrays 31 Elemente auf, aber das dynamische nur 30. Ist das Absicht?

dominikkv 23. Mär 2010 16:20

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?

pokermaster2007 23. Mär 2010 16:40

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:
if checkbox[i].Checked = True then ausgewählte_programme[j] := checkbox[i].Caption;
Aber diese taucht nun nicht mehr auf.
Anstatt desen ist mein array ausgewählte_programme nun leer o.O

shmia 23. Mär 2010 16:47

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.
Seite 1 von 3  1 23      

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