Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [gelöst]ListBox Zugriffsverletzung (https://www.delphipraxis.net/164714-%5Bgeloest%5Dlistbox-zugriffsverletzung.html)

ONeill 26. Nov 2011 12:40


[gelöst]ListBox Zugriffsverletzung
 
Hallo Forum,

ich habe mal ein kleines Problem.
Ich habe mir hier aus dem Forum die beiden veränderten Klassen für die ListBox genommen, damit zwei ListBoxen parallel scrollen.
Folgender Code ist da rausgekommen:
Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mysql;

type
  TNoVScrolllistbox = Class( Tlistbox )
  private
    FRef : TCustomListBox;
    Procedure WMNCCalcSize( Var msg: TMessage );
      message WM_NCCALCSIZE;
  published
  property Reference : TCustomListBox read FRef write FRef;
  end;
  TMyListBox = class(TListBox)
  private
    FRef : TCustomListBox;
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Reference : TCustomListBox read FRef write FRef;
  end;
//[...]
private

  public
    LBox : TNoVScrolllistbox;
    LBox1: TMyListBox;
  end;
//[...]
procedure TSearchfor.FormCreate(Sender: TObject);
begin
  Randomize;
  LBox := TNoVScrolllistbox.Create(Self);
  with LBox do
  begin
   Parent := Self;
   Visible := true;
   Top := 96;
   Left := 0;
   Width := 154;
   Height := 244;
   Enabled:=False;
  end;
  Randomize;
  LBox1 := TMyListBox.Create(Self);
  with LBox1 do
  begin
   Parent := Self;
   Visible := true;
   Top := 96;
   Left := 154;
   Width := 65;
   Height := 244;
   Reference :=LBox;
  end;
  SetScrollRange(LBox.Handle, SB_VERT, 0, 0, False);
end;

procedure TNoVScrolllistbox.WMNCCalcSize(var msg: TMessage);
var
  style: Integer;
begin
  style := getWindowLong( handle, GWL_STYLE );
  If (style and WS_VSCROLL) <> 0 Then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  inherited;
end;

procedure TSearchfor.FormDestroy(Sender: TObject);
begin
LBox.Free;
end;

constructor TMyListBox.Create(AOwner: TComponent);
begin
  inherited;
  FRef := nil;
end;

procedure TMyListBox.WMHScroll(var Message: TWMHScroll);
begin
 inherited;
end;

procedure TMyListBox.WMVScroll(var Message: TWMVScroll);
begin
 inherited;
 if Assigned(FRef) then FRef.TopIndex := TopIndex;
end;

end.
Funktioniert auch alles ganz gut. Allerdings habe ich dann das Problem, das ich von einem anderen Form, welches so erstellt wird:
Delphi-Quellcode:
procedure TSearchfor.btnshowuserClick(Sender: TObject);
begin
TShowuser.Create(Self);
end;
nicht wie folgt auf die ListBoxen zugreifen kann:
Delphi-Quellcode:
showmessage(Searchfor.LBox.Items[SearchFor.LBox.ItemIndex]);
Da bekomme ich immer eine Zugriffsverletzung.
Kann mir da jemand weiterhelfen, ich bin mit meinem Latein am Ende, ich weiß ehrlich nicht mehr weiter, rein theoretisch müsste es ja gehen.
Ich hoffe, das es nicht nur ein Problem ist, welches ich übersehe :(

Danke schonmal für eure Hilfe schonmal im voraus,

MGC 26. Nov 2011 12:56

AW: ListBox Zugriffsverletzung
 
Hallo,

erzeugst Du Deine Objekte auch? Also z.B.:
Delphi-Quellcode:
MyCustomListBox := TMyCustomListBox.Create;
Gleiches Problem sehe ich für das Feld FRef. Du hast es zwar als TCustomListBox deklariert, solltest die CustomListBox aber auch erzeugen oder wird das Feld FRef mit einer ListBox verbunden, die Du im Form hast?

Delphi-Quellcode:
MyCustomListBox.Reference := MyFormListBox;
Diese Variante wäre nicht sehr gut, da es sich in Deinem Form höchstwahrscheinlich dann um eine TListBox handelt, die nicht so ohne weiteres an eine TCustomListBox übergeben werden kann.
Andernfalls, solltest Du die FRef-Felder beim Aufruf des Konstruktors erzeugen.

Delphi-Quellcode:
constructor TMyCustomListBox.Create;
begin
  inherited Create;
  self.FRef := TCustomListBox.Create;
end;
Viele Grüße,

ONeill 26. Nov 2011 13:00

AW: ListBox Zugriffsverletzung
 
Ich erzeuge sie doch, siehe in dem FormCreate ereigniss.
Befüllt werden die auch.

MGC 26. Nov 2011 13:04

AW: ListBox Zugriffsverletzung
 
Entschuldige, habe ich nicht gesehen.

:?:
Nochmal eine andere Frage.
Du möchtest mit SearchFor.LBox.Items auf Deine CustomListBox zugreifen, diese Methode scheinst Du allerdings gar nicht in Dein Objekt eingebunden zu haben.

Bist Du Dir hier sicher, das durch die With-Anweisung nicht
Delphi-Quellcode:
LBox1.Reference := LBox1.LBox;
vom Compiler verstanden wird?

Delphi-Quellcode:
 with LBox1 do
  begin
   Parent := Self;
   Visible := true;
   Top := 96;
   Left := 154;
   Width := 65;
   Height := 244;
   Reference :=LBox;
  end;

ONeill 26. Nov 2011 13:12

AW: ListBox Zugriffsverletzung
 
Also, ich habe jetzt den Zugriff auf die ListBox so umgesetzt:
Delphi-Quellcode:
showmessage(Searchfor.LBox.Reference.Items[Searchfor.LBox.Reference.ItemIndex]);
Allerdings das gleich eProblem :(

MGC 26. Nov 2011 13:38

AW: ListBox Zugriffsverletzung
 
Ich muss zugeben, ich habe auf diesem Gebiet bisher keine Erfahrung sammeln können und momentan auch keine IDE hier zur Vefügung.
Hast Du Daten in Deinen Listboxen hinterlegt, bzw. hast Du eine Sicherheistabfrage, die Dir zurückmeldet das es keine Einträge gibt und die Exception behandelt?

Ich nehme mal an, Du hast Dich an diesem Betrag orientier?

ONeill 26. Nov 2011 13:45

AW: ListBox Zugriffsverletzung
 
Der beitrag ist richtig, ja.
Ich habe erstmal keine Überprüfung ob etwas ausgewählt wurde gemacht. Das wollte ich später machen. Allerdings ist die Liste befüllt und beim Klicken auf den Button zum Form erstellen, habe ich auch was ausgewählt. Ansonsten wäre es ja logisch :(

lbccaleb 26. Nov 2011 13:59

AW: ListBox Zugriffsverletzung
 
Zitat:

Zitat von ONeill (Beitrag 1137957)
Da bekomme ich immer eine Zugriffsverletzung.
Kann mir da jemand weiterhelfen, ich bin mit meinem Latein am Ende, ich weiß ehrlich nicht mehr weiter, rein theoretisch müsste es ja gehen.
Ich hoffe, das es nicht nur ein Problem ist, welches ich übersehe :(

Danke schonmal für eure Hilfe schonmal im voraus,


1. Du solltest mehr Infos posten, zb was für eine Zugriffsverletzung auftritt!
2. Hast du denn mal selber durch deinen Code gesteppt, und geschaut ob es nicht an was anderem liegen könnte? Der Fehler ist meistens eine Zeile über dem von Delphi makierten.
3. Sollte das nicht der Fall sein, wirst du mehr von deinem Code posten müssen.

MGC 26. Nov 2011 14:03

AW: ListBox Zugriffsverletzung
 
Wieso sind LBox udn LBox1 bei Dir in einem public Bereich?
Zu welchem Object oder Form gehören sie? Momentan sieht das auf diese Weise seltsam aus. a Du aber Auslassungszeichen //[..] verwendet hast, gehe ich davon aus, dass dort noch mehr Code ist.
Aber aus welchem Grund nimmst Du dafür keine globalen Variablen? Aus Sicherheistgründen?

Bummi 26. Nov 2011 14:14

AW: ListBox Zugriffsverletzung
 
Searchfor wird schon richtig iniatialisiert?
Also im Projekt
Application.CreateForm(TSearchfor , Searchfor );

oder im Code Searchfor := TSearchfor.Create(xxx)

und nicht in der Art
Delphi-Quellcode:
With TSearchfor.Create(self) do ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Seite 1 von 2  1 2      

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