Autor Beitrag
Maus90
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 12:39 
Hallo,
wir versuchen gerade eine stringgridzeile zu löschen, die auch gleichzeitig durch eine zeigerverkettete Liste dargestellt wird. Allerdings werden bei uns immer die abenteuerlichsten Sachen gelöscht wie zB zwei auf ein mal, dann kommt es mal vor, dass der Inhalt des ersten Eintrages verändert wird oder dass beim ersten mal das löschen des letzten eintrages ganz normal klappt, beim zweiten mal aber nicht mehr.
Könnt ihr euch das mal anschauen?
(anmerkung: Man soll zuerst auf löschen klicken können und dann ein Element aus der Liste auswählen)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.Lschen1Click(Sender: TObject);
begin
  if anzahl>0
    then begin
      loeschen:=true;
      showmessage('Bitte zu löschendes Element anklicken');
    end
    else showmessage('Kein Element vorhanden')
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var Canselect: Boolean);
  var temp,vor:TZeiger;
      i:integer;
begin
  if loeschen
    then begin
      temp:= anfang;
      vor:= nil;
      For i:=2 to Arow do begin
        vor:= temp;
        temp:= temp^.next;
      end;
      if temp = anfang
        then anfang:= anfang^.next
        else vor^.next:= temp^.next;
      gespeichert:= false;
      dispose(temp);
      aktualisieren;
    end;
end;
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Di 07.10.08 12:55 
Wo wird'n loeschen wieder auf false gesetzt?
Maus90 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 13:49 
Stimmt. Hab ich jetzt mal geändert, aber macht auch nicht viel.es kommt imemr ncoh vor, dass sich im ersten eintrag was ändern kann(zB. steht da auf einmal: I||ä||||||||||Heig||||||||Capt-||||| (die Striche sind dabei dicker)) Zudem können auch noch mehr gelöscht werden..
Mir ist gerade auch aufgefallen, dass wenn ich diesen Kauderwelsch da stehen habe und ich wieder ein neues Element hinzufüge, dann ersetzt das neue element diesen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.10.08 13:56 
Da stimmt dann was mit deinen Zeigern nicht, auf den ersten Blick sehe ich da keinen Fehler.
Hast du das mal debuggt? Dann würdest du dabei ja sehen können was mit deinen Zeigern passiert, wenn der Quelltext ausgeführt wird.
Maus90 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 14:07 
-ähm- Debuggen?

sry wir machen ads Programm nur in der Schule^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.10.08 14:14 
Du könntest das Projekt einfach mal komplett anhängen, gebraucht werden die .pas, .dfm und die .dpr Datei ;-). Das kannst du unterhalb deines Beitrags, wenn du ihn schreibst.

Was ich mit Debuggen meine (nur ganz kurz):
Du kannst einen Haltepunkt im Quelltext setzen (mit F5 oder einem Klick vor die Zeile). Dann hält das Programm an der Stelle an und du kannst mit F7 die einzelnen Befehle einzeln abarbeiten lassen. Je nach Delphiversion kannst du dann wenn du die Maus über Variablen hälst (oder zumindest mit Markieren und Strg + F7) den Wert sehen.
So kannst du dann schrittweise nachvollziehen was passiert.

Welches Delphi habt ihr in der Schule? Grundsätzlich würde ich dir schon raten Delphi auch zu Hause zu installieren, es gibt auch kostenlose Versionen, dann kannst du da mal etwas mehr ausprobieren (wenn du das möchtest ;-)).
Maus90 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 15:09 
WIr benutzen Delphi6 und ich habs auch zu Hause aufm rechner^^
Ich bin das gerade mal schnell durchgegengen, der Weg scheint zu stimmen.. ich guck mir jetzt mal die Werte genauer an.

Und ich darf die Dateien, die du bruachst nicht anhängen Ö.ö Der "Dateianahnag ist verboten"
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.10.08 15:10 
Pack die einfach als .zip ein, dann ist es nur eine Datei ;-).
Maus90 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 18:16 
hi,
jetzt gehts doch. Also das mit den Variablen sehen klappt bei mir gar nicht mal so gut. vielleicht mach ich es ja auch falsch.
Jedenfalls mach mal 4 einträge und lösche die beiden mittleren. Dann passiert etwas komisches.. jedenfalls manchmal.. Probiers einfach mal aus.
Jedenfalls ist mir aufgefallen, dass es vor kommt, dass beim durchlaufen von der Prozedur aktualisieren, er schon nach der ersten Zeile nach "while temp<>nil do begin" aufhört.(aber auch nur wenn am ende der Name falsch dargestellt wird)
Ich bin inzwischen total veriwrrt, weil ich keine routine feststellen kann. Ich hoffe du kannst mir helfen.


Zuletzt bearbeitet von Maus90 am Di 07.10.08 19:21, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.10.08 18:39 
Also, ich muss mal schauen warum, aber klar ist folgendes.
Ich lege 4 Einträge an, und lösche dann jeweils den vorletzten 2 mal. Nachdem eigentlich nur noch 2 Einträge da sind, wird die Löschmethode noch einmal durchlaufen, woraufhin nur noch ein Eintrag in der Liste ist, in der Anzeige aber noch zwei.

Was genau da passiert muss ich mal anschauen. Du solltest vielleicht dein Löschen überdenken ;-). Warum nicht zuerst markieren und dann den markierten Eintrag löschen, wie es eigentlich normal wäre?
Maus90 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 07.10.08 19:21 
Wie rum es geschieht ist mir zunächst egal.

Wird das echt zwei mal durchlaufen? Meiner Meinung nach wird der erste nur halb durchlaufen und er springt dann irgendwie wieder stringgridselectcell.


Ahhh ich hab das Problem jetzt geschnallt. In aktualisieren greift er ja wieder auf eine Zelle zu, allerdings hab ich die stringgridselectcell noch nicht mit Loeschen:=false blockiert. deshalb springt er da wieder rein. wenn ich in aktualisieren das vorher mache scheint alles zu klappen.

Danke noch mal für deine Hilfe, ohne dich hätt ich wahrscheinlich alles gelöscht und es auf eine andere Weise versucht^^