AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung

Ein Thema von Koller · begonnen am 10. Jun 2006 · letzter Beitrag vom 15. Jun 2006
Antwort Antwort
Seite 2 von 3     12 3      
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#11

Re: Zugriffsverletzung

  Alt 12. Jun 2006, 11:13
Das komische ist ja, dass die alte Version funktioniert:
Delphi-Quellcode:
procedure TForm1.DeleteSubject(Sender : TObject);
var row,i,i2:integer;
begin
  row:=(Sender as TButton).Tag;
  if row=High(EditsArray) then
  begin
    for i2 := 1 to 6 do
    begin
      EditsArray[row][i2].Free;
    end;
    BtnLoeschenArray[row].Free;
  end else
  begin
    for i := row to High(EditsArray)-1 do
    begin
      for i2 := 1 to 6 do
      begin
        EditsArray[i][i2].text:=EditsArray[i+1][i2].text;
      end;
      BtnLoeschenArray[i].Tag:=BtnLoeschenArray[i+1].Tag;
    end;
      for i2 := 1 to 6 do
      begin
        EditsArray[High(EditsArray)][i2].Free;
      end;
      BtnLoeschenArray[High(EditsArray)].Free;
  end;
  SetLength(EditsArray,Length(EditsArray)-1);
  SetLength(BtnLoeschenArray,Length(BtnLoeschenArray)-1);
  UpdateSubjects;
end;
Und die neue:
Delphi-Quellcode:
 
procedure TMarkFile.DeleteSubject(Sender : TObject);
var row,i,i2:integer;
begin
  row:=(Sender as TButton).Tag;
  if row=High(FEingabeArray) then
  begin
    for i2 := 1 to 5 do
    begin
      FreeAndNil(FEingabeArray[row].array_edit[i2]);
    end;
    FreeAndNil(FEingabeArray[row].button_loeschen);
    FreeAndNil(FEingabeArray[row].Combobox_fach);
  end else
  begin
    for i := row to High(FEingabeArray)-1 do
    begin
      for i2 := 1 to 5 do
      begin
        FEingabeArray[i].array_edit[i2].text:=FEingabeArray[i+1].array_edit[i2].Text;
      end;
      FEingabeArray[i].button_loeschen.Tag:=FEingabeArray[i+1].button_loeschen.Tag;
      FEingabeArray[i].Combobox_fach.Text:=FEingabeArray[i+1].Combobox_fach.Text;
    end;
      FreeAndNil(FEingabeArray[High(FEingabeArray)].Combobox_fach);
      FreeAndNil(FEingabeArray[High(FEingabeArray)].button_loeschen);
      for i2 := 1 to 5 do
      begin
        FreeAndNil(FEingabeArray[High(FEingabeArray)].array_edit[i2]);
      end;
  end;
  SetLength(FEingabeArray,Length(FEingabeArray)-1);
  UpdateSubjects;
end;
funktioniert nicht, obwohl ich vom Prinzip her nichts geändert habe. Ich habe nur die verschiedenen Komponenten in ein array of record gepackt.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 11:55
Hallo Koller,

ich habe mir dein Projekt herunter geladen und den Code angepasst, damit das Löschen funktioniert. Ich finde du solltest bestimmte Teilaspekte deines Projektes zuerst isoliert ausprobieren und testen. Dein Code zeigt deutlich, dass du auf dem besten Weg bist die Übersicht zu verlieren. Wenn du schon soetwas wie ein Multi-Document-Interface realisieren möchtest, dann musst du auch dafür sorgen dass es in deiner Form1 eine Eigenschaft ActiveFile gibt, über die man die richtige Komponente TMarkFile selektieren kann.

Viel Spaß noch mit deinem Projekt.

marabu
Angehängte Dateien
Dateityp: zip mark_analyzer_672.zip (8,7 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#13

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 16:34
Erst mal vielen Dank!
Hast du nur diese Prozedur geändert?
Delphi-Quellcode:
procedure TMarkFile.DeleteSubject(rowIndex: Integer);
var
  iRow, iEdit: Integer;
begin
  for iRow := rowIndex to Pred(High(FEingabeArray)) do
  begin
    for iEdit := 1 to 5 do
      FEingabeArray[iRow].array_edit[iEdit].text := FEingabeArray[Succ(iRow)].array_edit[iEdit].Text;
    FEingabeArray[iRow].button_loeschen.Tag := FEingabeArray[Succ(iRow)].button_loeschen.Tag;
    FEingabeArray[iRow].Combobox_fach.Text := FEingabeArray[Succ(iRow)].Combobox_fach.Text;
  end;

  with FEingabeArray[High(FEingabeArray)] do
  begin
    for iEdit := 1 to 5 do
      array_edit[iEdit].Free;
    Combobox_fach.Free;
    button_loeschen.Free;
  end;
  SetLength(FEingabeArray, High(FEingabeArray));
  UpdateSubjects;
end;
Zitat von marabu:
dann musst du auch dafür sorgen dass es in deiner Form1 eine Eigenschaft ActiveFile gibt, über die man die richtige Komponente TMarkFile selektieren kann.
Ich kann doch mit über Form1.Pagecontrol1.ActivePageIndex-1 den Index des richtigen Objekts herausbekommen?!?!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 17:31
Es sind schon noch ein paar Änderungen mehr. Besorge dir WinMerge (2.5MB) und du wirst sie sehen. Relevant für dein Löschproblem ist eigentlich nur die Entkopplung des OnClick event handlers vom eigentlichen Löschvorgang (DeleteSubject). Alle anderen Änderungen habe ich auf halbem Weg wieder rückgängig genmacht, damit du dein Programm noch erkennst.

Zitat von Koller:
Ich kann doch über Form1 .Pagecontrol1 .ActivePageIndex-1 den Index des richtigen Objekts herausbekommen?!
Warum willst du jedesmal nach dem richtigen Objekt suchen, wenn du mit einer leicht zu pflegenden Eigenschaft einen direkten Zeiger darauf bereit halten kannst?

Freundliche Grüße

marabu
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#15

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 17:43
Zitat von marabu:
Warum willst du jedesmal nach dem richtigen Objekt suchen, wenn du mit einer leicht zu pflegenden Eigenschaft einen direkten Zeiger darauf bereit halten kannst?
An eine Property für Klasse TForm1 dachte ich auch schon. Wie würde so etwas mit einem Zeiger aussehen?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 18:03
Eine property hast du schnell deklariert:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    ActiveFileIndex: Integer;
    function GetActiveFile: TMarkFile;
  public
    property ActiveFile: TMarkFile read GetActiveFile;
  end;

function TForm1.GetActiveFile: TMarkFile;
begin
  Result := Files[ActiveFileIndex];
end;
Das Feld ActiveFileIndex musst du ständig in Übereinstimmung mit den Aktionen des Benutzers aktualisieren. Zuvor solltest du dir ein paar Gedanken zur Benutzerschnittstelle und zu deiner Programmstruktur machen. Ich vermisse ein Konzept. So läufst du Gefahr eine Menge überflüssigen Code zu schreiben, der später mühevoll raus operiert werden muss.

marabu
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#17

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 18:16
Zitat von marabu:
Eine property hast du schnell deklariert:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    ActiveFileIndex: Integer;
    function GetActiveFile: TMarkFile;
  public
    property ActiveFile: TMarkFile read GetActiveFile;
  end;

function TForm1.GetActiveFile: TMarkFile;
begin
  Result := Files[ActiveFileIndex];
end;
Genauso wollte ich das auch machen Aber wegen dem Zeiger war ich irritert.
Zitat von marabu:
Das Feld ActiveFileIndex musst du ständig in Übereinstimmung mit den Aktionen des Benutzers aktualisieren. Zuvor solltest du dir ein paar Gedanken zur Benutzerschnittstelle und zu deiner Programmstruktur machen. Ich vermisse ein Konzept. So läufst du Gefahr eine Menge überflüssigen Code zu schreiben, der später mühevoll raus operiert werden muss.
Ich war bisher immer der Meinung, da wäre ein (bisschen) Konzept drin
Kannst du mir nen Ansatz geben, weil ich von alleine weiterkommen möchte
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#18

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 18:59
Als erstes rate ich dir auf verschachtelte PageControls zu verzichten. Auf der zweiten Ebene deines Programms ist das auch garnicht hilfreich. Durch deinen Button "Daten auswerten" ist ein Sekundärfenster die bessere Lösung. Nimm die Seite Datenauswertung ganz weg und mache die Seite Dateneingabe direkt zu einer Seite der ersten Ebene.

Auf der ersten Ebene hast du einen Reiter "HomePage". Wenn alle folgenden Seiten gleichartig sind, dann solltest du auf eine andersartige erste Seite unbedingt verzichten.

Die von dir dann überarbeitete Komponente TMarkFile sollte dann nicht der Verwalter des zugehörigen TabSheets sein, sondern das TabSheet sollte über seine Tag property auf das zugehörige TMarkFile verweisen.

Vielleicht ist es dir nicht bekannt, aber ScreenEx birgt in diesen Zeiten die Gefahr einer Abmahnung. Informiere dich mal.

marabu
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#19

Re: Zugriffsverletzung

  Alt 13. Jun 2006, 19:09
Zitat von marabu:
Als erstes rate ich dir auf verschachtelte PageControls zu verzichten. Auf der zweiten Ebene deines Programms ist das auch garnicht hilfreich. Durch deinen Button "Daten auswerten" ist ein Sekundärfenster die bessere Lösung. Nimm die Seite Datenauswertung ganz weg und mache die Seite Dateneingabe direkt zu einer Seite der ersten Ebene.

Auf der ersten Ebene hast du einen Reiter "HomePage". Wenn alle folgenden Seiten gleichartig sind, dann solltest du auf eine andersartige erste Seite unbedingt verzichten.

Die von dir dann überarbeitete Komponente TMarkFile sollte dann nicht der Verwalter des zugehörigen TabSheets sein, sondern das TabSheet sollte über seine Tag property auf das zugehörige TMarkFile verweisen.
Dankeschön! Ich versuche es umzusetzen
Zitat von marabu:
Vielleicht ist es dir nicht bekannt, aber ScreenEx birgt in diesen Zeiten die Gefahr einer Abmahnung. Informiere dich mal.
Wie kommst du darauf? Deswegen? (Biotec-Filter usw.) --> http://www.google.de/search?hl=de&q=...le-Suche&meta= oder ist das so ne Verarsche wie 'Kennt ihr Mike Rosoft?'
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#20

Re: Zugriffsverletzung

  Alt 15. Jun 2006, 15:46
*push*
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 23:21 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