Kartei-Kästen

Started by Arcuso · 2010-02-15 14:37 UTC · 3 replies · SMF topic #1178

Späten Dank für die Infos, Fred !

Da es schließlich auf's Befinden des Anwenders ankommt, hat sich für unseren Bedarf der Einsatz von Paletten als weniger praktisch herauskristallisiert. Durch die Möglichkeit nicht-modale Dialoge zu minimieren, erscheinen die Kartei-Kästen flexibler. Mir fallen in diesem Zusammenhang ein paar Fragen/Anregungen ein:

1.)
Als 3.Zustand von andockbaren Dialogen, sollte es zum schwebenden Modus eben auch den minimierten geben, bei dem er sich automatisch in die Statusleiste von AutoCAD an einer freien Stelle eingliedert. Ohne Klick sollte dabei das Skalieren und Positionieren beim Umschalten der Zustände auch mit Lisp möglich sein.

2.)
Wenn man einen Dialog mit den benötigten Steuerelementen samt zugehörigen Funktionen erstellt hat, wäre es praktisch, ihn so wie er ist (quasi als neutral lauffähiges Mudul mit zugehörigen Lisp-Funktionen, nur einmal vorhanden und daher leicht zu warten), jeweils in einen anderen modalen, nicht-modalen Dialog oder in eine Karteikarte mit einem einfachen Verweis einblenden zu können. Wegen der Objekt-Instanzen und deren Namens-Kaskaden würde das aber wahrscheinlich das ganze Konzept von OpenDLC über den Haufen schmeißen.

3.)
Manchmal möchte man in einem Dialog mit mehreren Eingabe-Feldern, Listen, etc. durch einen Vor-/Zurück-Mechanismus ganze Daten-Sätze und Dialog-Zustände restaurieren. Das kann man zwar jetzt durch Auswerten der Eigenschaften aller Elemente und Speichern in einer Assoziatons-Liste.
Ein Hindernis ist aber dabei z.B. so eine Funktion wie dcl_Control_GetPos, die eine Daten-Liste retourniert, das Pendant dcl_Control_SetPos jedoch 4 Einzel-Argumente erwartet.
Praktisch wäre es, wenn man quasi in einer Moment-Aufnahme des aktuellen Dialoges den ganzen Dump in einer Liste speichern und ihn genauso mit einer Funktion wieder restaurieren könnte.
Hallo, vielen Dank für die Rückmeldung.

author=Arcuso link=topic=1178.msg6270#msg6270 date=1266244670 wrote:
Da es schließlich auf's Befinden des Anwenders ankommt, hat sich für unseren Bedarf der Einsatz von Paletten als weniger praktisch herauskristallisiert.


Kann ich so nicht unbedingt unterstreichen. Ich bin gerade dabei, eine ganze Reihe andockbarer Dialoge und nicht-modaler Dialoge in Paletten zu wandeln. Für das derzeit noch bestehende Manko der nicht steuerbaren Positionierung und Dockingzustände und des Automatisch-Ausblenden-Zustandes will ich kurzfristig Abhilfe schaffen lassen, da Lösungsvorschläge bereits extistieren.

author=Arcuso link=topic=1178.msg6270#msg6270 date=1266244670 wrote:
Als 3.Zustand von andockbaren Dialogen, sollte es zum schwebenden Modus eben auch den minimierten geben, bei dem er sich automatisch in die Statusleiste von AutoCAD an einer freien Stelle eingliedert. Ohne Klick sollte dabei das Skalieren und Positionieren beim Umschalten der Zustände auch mit Lisp möglich sein.


Hast Du dafür mal ein Beispiel eines AutoCAD/Map/Civil-Befehls, bei dem ich mir das anschauen kann? Ich kann mir das grad nicht vorstellen. Insbesondere der letzte Satz ist mir fremd  :-\

author=Arcuso link=topic=1178.msg6270#msg6270 date=1266244670 wrote:
jeweils in einen anderen modalen, nicht-modalen Dialog oder in eine Karteikarte mit einem einfachen Verweis einblenden zu können.


That's right. Dialog-Vererbungen und -instanzen sind derzeit nicht möglich. Da diese Frage aber bereits mehrfach aufgetaucht ist, bitte ich Dich dies im {2} einzutragen.

author=Arcuso link=topic=1178.msg6270#msg6270 date=1266244670 wrote:
Ein Hindernis ist aber dabei z.B. so eine Funktion wie dcl_Control_GetPos, die eine Daten-Liste retourniert, das Pendant dcl_Control_SetPos jedoch 4 Einzel-Argumente erwartet.


Versuchs doch mal mit Lisp  ;)

(setq lstPos (dcl_control_getpos MyProj_MyForm_MyControl))
(apply 'dcl_control_setpos (cons MyProj_MyForm_MyControl lstPos))

author=Arcuso link=topic=1178.msg6270#msg6270 date=1266244670 wrote:
Praktisch wäre es, wenn man quasi in einer Moment-Aufnahme des aktuellen Dialoges den ganzen Dump in einer Liste speichern und ihn genauso mit einer Funktion wieder restaurieren könnte.


Ich weiß nicht, ob es das trifft, aber versuch mal folgendes:


(dcl_Form_Hide signothek_sc_signothek T)
;; jetzt passiert was
(dcl_Form_Hide signothek_sc_signothek nil)


VG, Fred
author=Fred Tomke link=topic=1178.msg6277#msg6277 date=1266307285 wrote:

Hast Du dafür mal ein Beispiel eines AutoCAD/Map/Civil-Befehls, bei dem ich mir das anschauen kann? Ich kann mir das grad nicht vorstellen. Insbesondere der letzte Satz ist mir fremd  :-\



Beispiel hab ich keines, gemeint habe ich folgendes:
Wenn nun der minimierte Dialog passiv in der Statusleiste ruht, würde ich ihn gern aus irgendeiner Lisp-Anwendung heraus in den geöffneten Zustand (schwebend oder gedockt) schalten, ohne mit der Maus auf den dafür vorgesehenen Button klicken zu müssen. Nach Gebrauch soll die Anwendung den Dialog wieder minimiert in die Status-Leiste zurück schicken können. Im Prinzip wäre das eine 3.Option zu 'dcl_Form_Hide', soll lediglich den Bedarf von Funktionen zum Skalieren/Positionieren erübrigen und vorallem die korrekte Eingliederung in AutoCAD's Statusleiste übernehmen (es könnten dann dort ja auch mehrere minimierte Dialoge abgelegt werden).

author=Fred Tomke link=topic=1178.msg6277#msg6277 date=1266307285 wrote:

Versuch's doch mal mit Lisp:
(setq lstPos (dcl_control_getpos MyProj_MyForm_MyControl))
(apply 'dcl_control_setpos (cons MyProj_MyForm_MyControl lstPos))



Das hab ich ohnehin auch so gelöst. Um aber alle aktuellen Eigenschaften von allen aktuellen Steuer-Elementen abzuspeichern, müsste man die Werte explizit einzeln abfragen und sie in einer Assoziazions-Liste zusammenfassen, die wiederum Bestandteil einer übergeordneten Liste ist. Jetzt könnte man mit einem Vor- und Zurück-Button von einem zum nächsten Datensatz blättern und den gespeicherten Zustand wieder restaurieren. Weil ja nicht nur Inhalte von Daten-Feldern, sondern auch Eigenschaften der Steuer-Elemente (Farbe, Textstil, etc.) relevant sein können, entsteht das Bedürfnis, alle Dialog-Daten als Paket von einer implementierten Funktion sammeln bzw. wieder herstellen zu lassen.

Vorläufig vielen Dank für deine Hilfe!

arcuso

author=Arcuso link=topic=1178.msg6324#msg6324 date=1266570726 wrote:
Nach Gebrauch soll die Anwendung den Dialog wieder minimiert in die Status-Leiste zurück schicken können. Im Prinzip wäre das eine 3.Option zu 'dcl_Form_Hide', soll lediglich den Bedarf von Funktionen zum Skalieren/Positionieren erübrigen und vorallem die korrekte Eingliederung in AutoCAD's Statusleiste übernehmen (es könnten dann dort ja auch mehrere minimierte Dialoge abgelegt werden).


Da kann ich Dir nur raten, bei den OpenDCL-Samples nach dem FormMover-Beispiel zu fahnden.
Damit kann man genau das erreichen. Prinzipiell wirst Du das wohl per Hand nachbauen müssen.
Aber grundsätzlich machbar wäre es mit den verfügbaren OpenDCL-Boardmitteln.

author=Arcuso link=topic=1178.msg6324#msg6324 date=1266570726 wrote:
Um aber alle aktuellen Eigenschaften von allen aktuellen Steuer-Elementen abzuspeichern, müsste man die Werte explizit einzeln abfragen und sie in einer Assoziazions-Liste zusammenfassen, die wiederum Bestandteil einer übergeordneten Liste ist.


Ich bin mir noch nicht sicher, ob ich verstanden habe, WANN es konkret erforderlich wird, alle Steuerelementeigenschaften wiederherzustellen:
1. Willst Du nicht-modale Dialoge zwischenzeitlich ausblenden, würde ich die dcl_form_hide methode verwenden und so bleiben alle Einstellungen für die aktuelle AutoCAD-Sitzung beibehalten, solange Du sie nicht änderst.
2. Willst Du Dialoge generell schließen und sie sollen beim erneuten Öffnen immer noch genauso gefüllt sein, wie im Augeblick des Schließens, sollte es eigentlich nur nötig sein, Inhalte komplexer Steuerelemente (Baum, ListView, Grid) zu speichern und beim Öffnen wieder zuzuweisen. Alle geometrischen Eigenschaften (z.B. mit SetPos geändert) bleiben für die komplette AutoCAD-Sitzung erhalten auch über das Schließen und wieder Öffnen hinaus, solange Du sie nicht änderst.
3. Ich lese aber was vom Springen zwischen den Datensätzen und vermute daher, dass GetPos nur ein Beispiel für einen Rückgabewert war. Ich persönlich baue Inhalte von Steuerelementen beim Springen zwischen Datensätzen immer explizit auf und speichere sie nicht. Denn wer sagt mir, ob in einer MultiUser-Umgebung nich bereits jemand einen Datensatz geändert hat...
4. Aber es gibt vielleicht eine andere Variante, die man in Betracht ziehen sollte: Alle Eigenschaften speichern und danach wieder zuweisen.
Ich habe das mal ausprobiert. Vielleicht hilft das zumindest vom Ansatz her. Bitte beachte, dass GetPos die Summe der Eigenschaften Width, Height, Top und Left sind, die neben der Methode GetPos/SetPos über die Eigenschaften aus einzeln abfragbar und zuweisbar sind.


(defun get_dump (oForm)
  (mapcar '(lambda (oControl) (cons oControl (mapcar '(lambda (strProp) (cons strProp (dcl_Control_GetProperty oControl strProp)))
    (vl-remove-if '(lambda (x) (= (substr x 1 1) "(")) (dcl_control_getproperties oControl)))))
  (cons oForm (dcl_Form_GetControls oForm)))
); get_dump

(defun set_dump (lstProps)
  (mapcar '(lambda (lstControl / oControl)
    (setq oControl (car lstControl))
    (mapcar '(lambda (lstProp)
(dcl_control_setproperty oControl (car lstProp) (cdr lstProp))
      ); lambda
    (cdr lstControl))
  ); lambda
  lstProps)
); set_dump

(setq lstDump (get_dump MyProj_MyForm))
(set_dump lstDump)


VG, Fred