Delphi-PRAXiS

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 ValueListEditor - eintrag einfügen, ohne "änder"-Prozedur (https://www.delphipraxis.net/83475-valuelisteditor-eintrag-einfuegen-ohne-aender-prozedur.html)

xZise 3. Jan 2007 12:47


ValueListEditor - eintrag einfügen, ohne "änder"-P
 
Ich hoffe mal es ist verständlich :D

Und zwar habe ich eine ValueListEditor (VLE) in der von Prozedur X daten geschrieben werden.
Nun möchte ich aber nicht, dass der VLE dabei die Methode auslöst, dass was geändert wurde, weil ich nur möchte, dass diese Methode ausgelöst wird, wenn der Benutzer was ändert.
(Ansonsten kommt es zu einer AV :D)

Der_Unwissende 3. Jan 2007 15:22

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
Zitat:

Zitat von xZise
Ich hoffe mal es ist verständlich :D

Hi,
für mich ehrlich gesagt nicht.

Zitat:

Zitat von xZise
Und zwar habe ich eine ValueListEditor (VLE) in der von Prozedur X daten geschrieben werden.

Von wem stammt die VLE? Hast du die selbst geschrieben oder ist das eine fertige Komponente? Und wichtiger ist X eine externe Prozedur oder gehört die zur VLE (also wird intern etwas gemacht, oder extern?).

Zitat:

Zitat von xZise
Nun möchte ich aber nicht, dass der VLE dabei die Methode auslöst

Es wird eher ein Ereignis ausgelöst, die Methode ist nur die Behandlung des Ereignisses. Setzt du dieses Ereignis oder gibt es ein Standardereignis? Wer wird benachrichtigt wenn das passiert? Was genau führt dabei zu AV?

Wenn ich nicht die Antworten auf all diese (offenen) Fragen übersehen habe, würde ich schon sagen, dass es nicht wirklich gut verständlich ist was du möchtest. Schöner wäre es also, wenn du erstmal ausführlich erklären könntest was du machst und wo bzw. warum dabei ein Fehler auftritt.

An sich wird ja irgendwas zu der AV führen, vielleicht solltest du einfach mal in der Ereignisbehandlung prüfen ob diese AV auftreten würde und ggf. eben dafür sorgen, dass das nicht passiert.
Wenn du die Komponente selber schreibst und die AV daher kommt, dass zu irgendeinem Zeitpunkt die Behandlung ausgelöst wird, aber noch keine Methode zugewiesen wurde, so solltest du einfach vorher prüfen ob du einen gültigen Zeiger hast (also assigned(Zeiger)) und nur dann die Behandlung auslösen.
Wenn du die Ereignisbehandlung selber setzt / diese published ist, dann kannst du in Methode X einfach die Adresse der hier aufzurufenden Methode zwischenspeichern, der Ereignisbehandlung den Wert nil geben und vor verlassen von X wieder die gespeicherte Adresse zuweisen.

Gruß Der Unwissende

Luckie 3. Jan 2007 15:39

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
Setze die Ereignisprozedur vorher auf nil und nachher weist du ihr wieder die OnChange-Prozedur zu:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  ShowMessage(Edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.OnChange := nil;
  Edit1.Text := 'Hänschen Klein';
  Edit1.OnChange := Edit1Change;
end;
OnChange wird nur ausgelöst, wenn man direkt etwas in das Edit eingibt. Wird Text über die Schaltfläch eingefügt, wird OnChange nicht ausgelöst.

ibp 3. Jan 2007 16:02

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
...oder du nutzt...
Delphi-Quellcode:
procedure machvieledingeinternmitmeinemvle;
begin
  valuelisteditor1.Strings.BeginUpdate;
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.EndUpdate;
end;
... folge ist die methode...
Delphi-Quellcode:
procedure TForm1.ValueListEditor1StringsChange(Sender: TObject);
begin
 showmessage('änderung');
end;
wird nur einmal aufgerufen....du könntest natürlich noch ein flag setzen...

Delphi-Quellcode:
var flagkeinonchangeweilinternverarbeitung:boolean;

procedure machvieledingeinternmitmeinemvle;
begin
  flagkeinonchangeweilinternverarbeitung:=true;
  valuelisteditor1.Strings.BeginUpdate;
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.Add('schlüssel=wert');
  valuelisteditor1.Strings.EndUpdate;
  flagkeinonchangeweilinternverarbeitung:=false;
end;

procedure TForm1.ValueListEditor1StringsChange(Sender: TObject);
begin
  if flagkeinonchangeweilinternverarbeitung then exit;

  showmessage('änderung');
end;

xZise 3. Jan 2007 19:02

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
Zitat:

Zitat von Der_Unwissende
Zitat:

Zitat von xZise
Ich hoffe mal es ist verständlich :D

Hi,
für mich ehrlich gesagt nicht.

Schade... Dann wohl nicht...

Zitat:

Zitat von Der_Unwissende
Zitat:

Zitat von xZise
Und zwar habe ich eine ValueListEditor (VLE) in der von Prozedur X daten geschrieben werden.

Von wem stammt die VLE? Hast du die selbst geschrieben oder ist das eine fertige Komponente? Und wichtiger ist X eine externe Prozedur oder gehört die zur VLE (also wird intern etwas gemacht, oder extern?).

-> Siehte Komponentenplette
-> Forensuche
=> Es ist eine Dlephikomponente, seit längeren (D6/7 mind.)

Prozedur X ist eine externe Prozedur.
=> Eine Prozedur die innerhalb der Form ist, aber nicht vom VLE ausgelöst wurde.

Zitat:

Zitat von Der_Unwissende
Zitat:

Zitat von xZise
Nun möchte ich aber nicht, dass der VLE dabei die Methode auslöst

Es wird eher ein Ereignis ausgelöst, die Methode ist nur die Behandlung des Ereignisses. Setzt du dieses Ereignis oder gibt es ein Standardereignis? Wer wird benachrichtigt wenn das passiert? Was genau führt dabei zu AV?

Wenn ich nicht die Antworten auf all diese (offenen) Fragen übersehen habe, würde ich schon sagen, dass es nicht wirklich gut verständlich ist was du möchtest. Schöner wäre es also, wenn du erstmal ausführlich erklären könntest was du machst und wo bzw. warum dabei ein Fehler auftritt.

An sich wird ja irgendwas zu der AV führen, vielleicht solltest du einfach mal in der Ereignisbehandlung prüfen ob diese AV auftreten würde und ggf. eben dafür sorgen, dass das nicht passiert.
Wenn du die Komponente selber schreibst und die AV daher kommt, dass zu irgendeinem Zeitpunkt die Behandlung ausgelöst wird, aber noch keine Methode zugewiesen wurde, so solltest du einfach vorher prüfen ob du einen gültigen Zeiger hast (also assigned(Zeiger)) und nur dann die Behandlung auslösen.
Wenn du die Ereignisbehandlung selber setzt / diese published ist, dann kannst du in Methode X einfach die Adresse der hier aufzurufenden Methode zwischenspeichern, der Ereignisbehandlung den Wert nil geben und vor verlassen von X wieder die gespeicherte Adresse zuweisen.

Gruß Der Unwissende

Was ist daran so unverständlich, dass du so viel Text schreiben musst?

Die Sachlage ist ganz einfach:

Zitat:

Wir haben:
  • eine Form
  • Eine VLE (Abk. für den TValueListEditor)
  • Prozedur X
  • Prozedur "OnChange"

Nun wird in Prozedur X (es ist nicht von belangen, wer wo und wie sie aufgerufen wird!) etwas im VLE geändert, was die "Änderung"-Prozedur (oben als "Prozedur "OnChange"" bezeichnet) auslöst.
Meine Frage: Gibt es eine Prozedur, die nur ausgelöst wird, wenn ich etwas daran als Benutzer ändere.

Weitere Informationen
Und dann gibt es in DIESER Prozedur eine AV. Warum, ist nicht wichtig, weil es darum geht, dass ich 2 verschiedene Ansichten habe.
Einmal so eine art "Baumstrukutr" und dann einmal eine Tabelle (VLE). Und ich editiere immer beide gleichzeitig.

Problem => Sobald ich im VLE was eine Editiere, muss er es auch im "Baum" ändern.
@ Rest: Ich werde mir den Code nocheinmal genau angucken, und versuchen da was zu verbessern... Aber danke erstmal für eure Bemühungen

Der_Unwissende 4. Jan 2007 20:12

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
Zitat:

Zitat von xZise
Was ist daran so unverständlich, dass du so viel Text schreiben musst?

Also erstmal war das nicht soviel Text und nun ja, deine Frage war (für mich) so unverständlich, dass ich eben so viel Text benötigt habe. Wo ist das Problem? Ich werde hier mal keine abfällige Bemerkung dazu machen, aber ganz ehrlich, überleg einfach mal ob man dir mit etwas mehr Text vielleicht besser, schneller und zielgerichteter helfen kann oder nicht.
Also wenn ich da ein paar Sätze mehr, deren Nutzen und die benötigte Zeit (oder was auch immer) gegeneinander abwäge, ....

Zitat:

Zitat von xZise
Nun wird in Prozedur X (es ist nicht von belangen, wer wo und wie sie aufgerufen wird!) etwas im VLE geändert, was die "Änderung"-Prozedur (oben als "Prozedur "OnChange"" bezeichnet) auslöst.
Meine Frage: Gibt es eine Prozedur, die nur ausgelöst wird, wenn ich etwas daran als Benutzer ändere.

Weitere Informationen
Und dann gibt es in DIESER Prozedur eine AV. Warum, ist nicht wichtig, weil es darum geht, dass ich 2 verschiedene Ansichten habe.

Ich sehe irgendwie nicht, warum es jetzt so unwichtig ist, wo und wann die Aufgerufen wird. Ich dachte eigentlich, dass ich in den vielen Sätzen klar gemacht habe, dass je nach Art des Aufrufs (Ort und Zeitpunkt) unterschiedliche Probleme (ergo Unterschiedliche Lösungen) in Frage kommen. Scheinst das etwas in den falschen Hals bekommen zu haben.
Na ja, jedenfalls ist mir jetzt deutlich klarer wo eigentlich genau das Problem liegt und andere die ein gleiches Problem haben werden es vielleicht auch so sehen. Lösungen wurden schon genug vorgeschlagen.

Gruß Der Unwissende

xZise 4. Jan 2007 21:57

Re: ValueListEditor - eintrag einfügen, ohne "änder&
 
Sry @ Unwissende, aber ich verstehe nicht, was daran so weichtig ist, dass du weißt wann/wo diese Prozedur X aufegrufen wird.

Das Problem liegt auch anscheinend nicht in diese Prozedur, sondern in einer anderen.

PS: Ich hasse es mit TD zu debuggen :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 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