[Gelöst] Zeile markieren in Matrix-Form

7. April 2008 14:19

Hi alle!

Ich habe folgendes Problem(chen?) bei dem ich auf eure Hilfe hoffe ... (hab' im Forum leider nix passendes gefunden)

Ich möchte in einer Matrix-Form immer die Zeile markieren, die der Benutzer aktuell ausgewählt hat.
Dazu habe ich folgendes "gebastelt":

Code:
Form OnAfterGetCurrRecord()
ActiveNo := Rec."No.";   // Artikelnummer merken
...

<Feld>OnFormat()
CurrForm.<Feld>.UPDATESELECTED("No." = ActiveNo);


Im Prinzip funzt das so auch, d.h. "ActiveNo" wird richtig befüllt und UPDATESELECTED wird auch gesetzt ... aaaaber selektiert man einen anderen DS, so wird UPDATESELECTED nicht sofort vom "alten" DS entfernt!
Das Ganze scheint ein UPDATE Problem zu sein: minimiere ich die Form, oder wechsle kurz zu 'ner anderen, dann ist die Markierung (UPDATESELECTED) auch richtig gesezt ...

Habe schon diverses mit CurrForm.UPDATAE, UPDATECONTROLS etc. ausprobiert, bisher aber ohne Erfolg ...

Hat jemand 'ne Idee? Bin für jede "Inspiration" dankbar!

(Objekte 3.70, C/SIDE 4.0 SP3 U7)

Schöne Grüße,
Jörg
Zuletzt geändert von stryk am 7. April 2008 15:55, insgesamt 1-mal geändert.

7. April 2008 14:28

Naja, OnAfterGetCurrRecord und OnFormat werden (glaube ich) so ziemlich beide parallel beim Öffnen der Form einmalig nacheinander für jeden Datensatz durchlaufen.

Das heißt: Wenn der Benutzer sich dann auf einen anderen Datensatz stellt, werden die beiden Trigger NICHT noch einmal durchlaufen.

Hast du schon per Debugging probiert, welche Trigger überhaupt nochmal durchlaufen werden, wenn du den Cursor auf einen anderen Datensatz platzierst?

7. April 2008 14:29

Hmm,
ich habe keine richtige Idee (geschweige Zeit zum Testen).
Daher nur Inspiriationen :cool:

Könnte es klappen, wenn die die neu einliest wenn der neue Datensatz markiert wird z.B.:
Code:
FIND('-')


Gibt es eine Option das beim neu Selektieren eines DS sich die "Select" funktion neu Initialisiert?
CurrForm.UPDATE(TRUE) bzw. FALSE ausprobiert?
(Evtl. auf verschiedenen Triggern: OnDeaktivate / OnActivate usw.)

7. April 2008 14:55

Danke für eure schnelle Antwort!

@Natalie: Ja, hab's im Debugger verfolgt. Das "merken" der Nummer im OnAfterGetCurrRecord funzt, die Variable ActiveNo wird korrekt gesetzt.
Das Problem scheint in der Tat der OnFormat Trigger zu sein: Der setzt zwar das UPDATESELECTED wenn der DS aktiviert wird, entfernt aber die Eigenschaft nicht mehr, wenn der DS verlassen wird ...
Erst nach "erzwingen" eines erneuten OnFormat-Trigger-Durchlaufs durch Minimieren/Wiederherstellen oder Deaktivieren/Aktivieren wird die Anzeige aktualisiert ...

@Mikka: Die verschiedensten Kombinationen von UPDATE, UPDATECONTROLS oder ACTIVATE bin ich schon durchgegangen ... das mit dem "erneut LEsen" werd' ich mal probieren ...

7. April 2008 15:08

stryk hat geschrieben:Das Problem scheint in der Tat der OnFormat Trigger zu sein: Der setzt zwar das UPDATESELECTED wenn der DS aktiviert wird, entfernt aber die Eigenschaft nicht mehr, wenn der DS verlassen wird ...


Wie gesagt: Der wird nur dann ausgeführt, wenn die Datensätze als solche insgesamt aufgebaut werden, oder wenn du als User in einen Datensatz klickst. Das Herausgehen interessiert OnFormat nicht.

Vielleicht funktioniert es so, wild geraten .... (Trigger OnFormat):
Code:
DS := Rec;
IF DS2.FIND('-') THEN
  REPEAT
    DS2.PK <> DS.PK THEN
      Rec := DS2;
  UNTIL DS2.NEXT = 0;
Rec := DS;


EDIT: Nee, ist Quatsch, das würde der ja dann auch schon beim Form-Aufbau machen und unnötig viele Datensätze auslesen *g*

7. April 2008 15:50

Hmmm ... nu' hab ich was gefunden, was im Prinzip funktioniert ...

Soweit wie bisher:
- Form OnAfterGetCurrRecord: Aktuelle Nummer merken
- Field OnFormat: UPDATESELECTED setzen

Und nun:
- Field OnDeactivate: CurrForm.UPDATE(FALSE);

Damit das richtig hinhaut, muss das Form.UPDATE in die OnDeactivate-Trigger aller Felder hinein ... ächz ... nicht schön, nicht schnell, aber es tut's ...

Bin für Verbesserungsvorschläge natürlich offen!

Gruß & Danke!
Jörg