AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Memo.Clear zeigt keinen Effekt - Falsche Anzeige
Thema durchsuchen
Ansicht
Themen-Optionen

Memo.Clear zeigt keinen Effekt - Falsche Anzeige

Ein Thema von gordon freeman · begonnen am 14. Dez 2005 · letzter Beitrag vom 14. Dez 2005
Antwort Antwort
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#1

Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:30
Hi Leute,
ich habe eine Lösung für das unten dargestellte Problem für den Informatik-Unterricht programmiert. Innerhalb einer selbst definierten Klasse habe ich folgendes:
Delphi-Quellcode:
procedure TTurm.ZeigeDich(Memo : TMemo);
var i:integer;
begin
  Memo.Clear;
  for i:=0 to length(Elemente)-1 do
    Memo.Lines.Add(inttostr(Elemente[i]));
end;
Auch wenn das Array Elemente leer ist wird jedoch immer noch eine Zahl im Memo angezeigt. Ich hab mal das ganze Programm angehängt, wäre nett, wenn ihr's euch mal ansehen könntet. Ich bin mit meinem Latein am Ende


Problem:
Ein Eingeborenenstamm hat 3 Türme. Auf dem ersten liegen sortiert und nummeriert 100 Scheiben. Die 100te ist die dickste und liegt ganz unten. darüber die 99te bis oben die 1te liegt, die ist am dünnsten. Jetzt sollen alle Scheiebn in genauso sortiert auf den 3.ten Turm gebracht werden, allerdings müssen 2 Regeln beachtet werden:
  • Es darf immer nur eine Scheibe bewegt werden.
  • Eine Scheibe darf nur auf dem Boden oder auf einer größeren Scheibe liegen, nie auf einer kleineren.
Angehängte Dateien
Dateityp: zip 3_t_rme_637.zip (173,4 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:37
dein Problem nennt man auch "Türme von Hanoi".
Das ist eine sehr beliebte Programmeiraufgabe, für die es tonnenweise fertige Lösungen gibt.

Zu deinem Memo:
übergib das memo mal so:
procedure TTurm.ZeigeDich(var Memo : TMemo); wenn Du einen Parameter als var-Parameter übergibst, kann das Original verändert werden.
Sonst wird mit der lokalen Kopie gearbeitet und das Original bleibt unverändert.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:44
Bei Klassen dürfte das eigentlich keinen Unterschied machen. Denn das, was du da bekommst ist ja ein Zeiger. Die lokale Kopie ist also in Wirklichkeit ein zweiter Zeiger. Das heißt der Unterschied ist hier folgender:

Delphi-Quellcode:
procedure Test1(x: TObject);
begin
  x := nil;
  // x ist nil
end;
procedure Test2(var x: TObject);
begin
  x := nil;
end;
var a: TObject;
begin
  a := TObject.Create; // Zeigt jetzt an Adresse xyz
  Test1(a); // a zeigt immer noch auf xyz
 Test2(a); // Jetzt ist auch a auf nil
end;
Alle Änderungen, die du am Objekt machst werden also auch ohne var übernommen. (Sieht man ja leicht z.B. am Sender-Parameter im TNotifyEvent).
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:45
Zitat von RavenIV:
Zu deinem Memo:
übergib das memo mal so:
procedure TTurm.ZeigeDich(var Memo : TMemo); wenn Du einen Parameter als var-Parameter übergibst, kann das Original verändert werden.
Sonst wird mit der lokalen Kopie gearbeitet und das Original bleibt unverändert.
Aber doch nicht bei einem Objekt . Klassen sind Referenztypen, Objektvariablen bestehen also nur aus einem Pointer, der auf das wirkliche Objekt im Speicher zeigt [edit] wie tigerman33 oben anschaulich demonstriert hat. [/edit]

@gordon: Ich kann dein Problem nicht nachvollziehen. Wenn ich beispielsweise n = 1 setzte, wird die Scheibe korrekt von links nach rechts gesetzt, weder im linken noch im mittleren Memo steht etwas.
Btw: Du musst die Türme auch wieder freigeben.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:46
Hi,
ach die schönen Türme von Hanoi. Dein sleep legt den Hauptprozess schlafen, dass heißt natürlich auch, dass dieser nicht neu zeichnet. Dein Algorithmus ist also so wie er ist schon vollkommen richtig, aber du solltest in deiner Methode procedure TForm1.Schiebe(n, Turm1, Turm2, Turm3: integer); noch ein Application.ProcessMessages; vor dem sleep einfügen (gibt Rechenzeit frei und damit wird neu gezeichnet).

Ein (wie ich glaube) schönerer Weg ist es dann einfach anders zu warten, statt sleep(500) kannst du auch
Delphi-Quellcode:
var time : Int64;
begin
  time := GetTickCount;
  while (GetTickCount - time) < 500 do
    begin
      Application.ProcessMessages;
    end;
end;
verwenden, das sollte auf jeden Fall klappen.

Schau einfach mal,
Gruß Der Unwissende

Ps: Nicht schlecht, ich hatte damals (gut, noch Pascal) eine deutlich unschönere Lösung
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 13:49
Zitat von RavenIV:
wenn Du einen Parameter als var-Parameter übergibst, kann das Original verändert werden.
Sonst wird mit der lokalen Kopie gearbeitet und das Original bleibt unverändert.
Das stimmt so nur bedingt.
Normalerweise sind Objekte die in Delphi mit "T" anfangen (im Prinzip) Pointer. Also wird in dem Fall auch nicht mit einer Lokalkopie gearbeitet. Wenn dem so wäre, würde kein Programm von mir funktionieren.

@gordon freeman:
Wenn Elemente ein Array ist, würde ich statt Length, High nehmen:
Delphi-Quellcode:
procedure TTurm.ZeigeDich(Memo : TMemo);
var i:integer;
begin
  Memo.Clear;
  for i:=Low(Elemente) to High(Elemente) do Memo.Lines.Add(inttostr(Elemente[i]));
end;
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Memo.Clear zeigt keinen Effekt - Falsche Anzeige

  Alt 14. Dez 2005, 14:20
Zitat von Khabarakh:
Btw: Du musst die Türme auch wieder freigeben.
Hab ich glatt vergessen, danke!

Zitat von Der_Unwissende:
(...) aber du solltest in deiner Methode procedure TForm1.Schiebe(n, Turm1, Turm2, Turm3: integer); noch ein Application.ProcessMessages; vor dem sleep einfügen (gibt Rechenzeit frei und damit wird neu gezeichnet).(...)
Das war's! jetzt funktioniert's perfekt. Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:28 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