MFCGridCtrl
-
du hast die grenzbereiche... alles dazwischen ist selectiert. nachhilfe in mathe gebe ich hier nicht. mach doch ne skizze und überleg selber!
-
alex-t schrieb:
nachhilfe in mathe gebe ich hier nicht. mach doch ne skizze und überleg selber!
also erlich gesagt was hat es mit mathe zu tun ??
alex-t schrieb:
du hast die grenzbereiche... alles dazwischen ist selectiert.
!eben nicht alles !
sory aber ich kapiere es nicht Hilfe
-
moment, entschuldige bitte... ich bin in den nächsten stunden etwas beschäftigt. danach poste ich dir mehr. glaube ich kanns dir dann in ruhe schreiben...
-
alex-t schrieb:
moment, entschuldige bitte... ich bin in den nächsten stunden etwas beschäftigt. danach poste ich dir mehr. glaube ich kanns dir dann in ruhe schreiben...
ok ich warte und danke alex-t :xmas1:
-
*oki, tut mir leid, hatte etwas zu viel weihnachtsstress. wollte einer bekannten etwas gutes tun, und dem sohnemann zu weihnachten einen spiele rechner zusammenschrauben. hat aber erst nicht so richtig sein sollen. bei km ein k7s5a und ein barton bestellt. erst nach mehreren stunden harte testarbeit herausgefunden, woran es liegt. tja, bin halt nicht mehr so auf dem neuesten technik stand. ist aber auch egal. die nächste hardware wird sowieso ein ht p4 m sein, mit mindestens 4 ghz. und das erst wenn so ein system für unter 1,5 zu haben ist und natürlich mit 2 jahren garantie und von dell. also in etwa 2 jahren

ach ja, und an alle die, die mich deshalb belächeln, dass meine freundin vor dem computer steht: egal wie viel erfolg man haben kann, ich würde alles dafür geben um mit meiner freundin zusammen zu sein. erfolg und geld ist wirklich nicht soo wichtig wie ein mensch mit dem man alles teilen kann.
wünsche allen frohe weihnachten!!!
*so... zurück zum thema.
nun, ich habe mir alles nochmal angeschaut. und ich muss feststellen, dass es kein leichtes thema ist. aber da hätte ich grossmaul schon früher drauf kommen können.
eine kleine weissheit. wenn etwas schwierig erscheint, kann es manchmal mit 5 minuten überlegen und 1 minute tippen gelöst werden...
wenn etwas leicht erscheint, kann es manchmal nach einer minute tippen zu einer katastrophe führen!!!meine überlegungen:
1. kam kann ja nicht nur normale mehrfachauswahlen treffen, sondern auch "wilde" mehrfachauswahlen. z.b. mit gedrückter ctrl taste mehrere nicht benachbarte zellen anklicken. diese sind dann ebenfalls in einer gewissen auswahl, die sich allerdings nicht ohne weiteres überprüfen lässt. zumindest habe ich noch keine methode entdeckt, wie man an einer liste dieser auswahl rankommt. die möglichkeiten die ich gefunden habe folgen weiter unten.
2. man kann auch mehrere zeilen UND/ODER spalten "wild" auswählen. ebenfalls mit gedrückter ctrl taste. dies führt zu einem grossen problem bei der methode die ich mir zunächst ausgedacht habe.
3. sagen wir du hast ein grid mit einer statischen elementen anzahl... dann kann ich dir weiterhelfen. ansonsten kann ich dich nur noch mehr verwirren.ich fange einfach mal an.
für meine ausführung rate ich dir das demo projekt zu laden und auch gleich mal zu starten. achja, und den mfc 7 bug fix nicht vergessen. falls der compiler an zwei stellen mit (int) meckert, abändern in (UINT).
let's go:
wenn du eine auswahl startest, egal ob mehrfach oder einzeln, tritt das ereignis:
ON_NOTIFY(GVN_SELCHANGING, IDC_GRID, OnGridStartSelChange)ein, und wenn du deine auswahl beendest heisst es:
ON_NOTIFY(GVN_SELCHANGED, IDC_GRID, OnGridEndSelChange)für den simpelsten fall, dass man benachbarte zellen ausgewählt hat, ist dies das bereits ausreichend um dich weiterzubringen. denn du kannst beim ersten ereignis eine ecke deines ausgewählten rechtecks festhalten und beim beenden des auswahl kommt die diagonal gegenüber liegende ecke des rechtecks. zeilen und spalten nummer bekommst du ja mit:
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct; Trace(_T("row %d, col %d (%d Selected)\n"), pItem->iRow, pItem->iColumn, m_Grid.GetSelectedCount());raus.
wie schon erwähnt erschwert die möglichkeit der mehrfachauswahl mit hilfe der ctrl taste.
ich hatte gerade schon überlegungen angestellt wie man die funktion erweitert und speziell für die ctrl auswahl eine lösung findet. allerdings ist die sache nicht gerade einfach. es gibt sicherlich eine lösung, die aber nicht sehr schön ausschaut.
die überlegung wäre: eine datenstruktur zum festhalten der gesamten auswahl. z.b. eine liste vom typ CCellID. und wenn eine auswahl beendet wird werden die elmente dort hinzugefügt.
hört sich einfach an. ist es aber nicht, denn wie so oft stellt sich die frage, neu ausgewählt oder hinzugefügt? das erste ersetzt die liste mit der aktuellen auswahl, das zweite fügt zur aktuellen auswahl die neue hinzu.die problematik beschränkt sich allerdings auf die kombination von mehrfachauswahlen. wenn man einzelauswahlen mit hilfe der ctrl taste zusammenfügt, also immer nur eine zelle anklickt, um diese zur auswahl hinzuzufügen, dann kann ich dir sicher weiterhelfen. leider haben die 5 minuten nachdenken nicht ausgereicht um eine lösung für ein problem zu finden. das da wäre: mit hilfe der ctrl taste kann man mehrfach auswahlen kombinieren.
es ergeben sich, so wie ich das bis jetzt sehe, zwei grosse probleme:
1. einzelne zellen können mehrfach in der liste auftauchen. lässt sich mit einer suchfunktion vermeiden. zu lasten der performance!
2. eine oder mehrere kombinierte mehrfachauswahlen wurden bereits getroffen. die ctrl taste wird losgelassen und es wird eine neue mehrfachauswahl getroffen, die grösser ist, als die gesamte alte auswahl. nach meinem verfahren wird diese dann nicht als neue auswahl angesehen, sondern als erweiterte auswahl der alten auswahl. kompliziert aber leider wahr. bin noch am überlegen, wie man dieses problem lösen könnte.ach ja, noch etwas. kann kann mit hilfe der ctrl taste eine auswahl auch zum teil aufheben.
123456789 1nnnnnnnn 2nAAAAAAn 3nAAAAAAn 4nnAAAAnn 5nnAAAAnn 6nAAAAAnn 7nAAAAAnn 8nnnnnnnn 9nnnnnnnn A = ausgewählte zellebei gedrückter ctrl taste auf (5|5) klicken und aus A wird n!
theoretisch könnte man jetzt die liste nach der bereits vorhandenen zelle durchsuchen und diese dann auch entfernen.
gerade noch mal vergewissert. mein verfahren würde das nicht als neue auswahl ansehen. mit ein paar zeilen mehr code könnte man hier ein akzeptables workaround bereitstellen.aber wie bereits gesagt, die kombination von mehrfachauswahlen macht mir zu schaffen. werde mal eine nacht drüber schlafen. muss jetzt aber erst mal meine sqlite klasse weiterschreiben. hoffe konnte dich wenigstens ein wenig weiterbringen.
tut mir leid, hab so laut gerufen, dass ich selbst nicht bemerkt habe, wie kompliziert die sache ist.
-
//Ums jetzt mal zu vereinfachen CCellRange m_range = m_Grid.GetSelectedCellRange(); for (int i = m_range.GetMinCol(); i <= m_range.GetMaxCol();i++) { for (int x = m_range.GetMinRow(); x <= m_range.GetMaxRow();x++) { if(m_Grid.IsCellSelected(x,i)) Trace(_T("Is selected Row %d Col %d\n"),x,i); } }Erklärung
GetSelectedCellRange gibt min und max der Selectierten zurück
Dadurch braucht man nicht alle durchzugehen.
Jetzt beginnen bei COLMIN von ROWMIN bis ROWMAX durchgehen und checken ob Selected bis COLMAX
-
das ist auch die lösung, die ich am anfang angesprochen habe. allerding hatte ich da in gedanken den worst case durchgespielt. man selektiere 1,1 und 1.000,1.000. 1.000.000 abfragen, ob eine zelle ausgewählt ist oder nicht.
möchte diese klasse selbst benutzen und arbeite meine erwähnte lösung weiter aus.
falls interesse besteht poste ich diese hier demnächst.
-
Du kannst ja in die Klasse eine Liste einbauen und bei jedem OnCHANGE in der Liste speichern oder löschen.
Es ist aber unwahrscheinlich da man 1,1 und 1000,1000 selektiert.
Insbesonders da dies sowieso viel speicher braucht.
-
hm, da hast du allerdings recht...
na ich werde mir mal etwas gedanken zum worst case machen und den normalfall durchrechnen... ist eine meiner lieblingsaufgaben. und bei dem ganzen kuchenessen kann ich das als entschuldigung verwenden.
-
Uf.... und ich dachte schon das ich so duff bin.
Vielen dank für die Antworten werde ich ausprobieren
Alex-t falls du die klasse erweiterst dann wurde ich mich freuen wenn du es mir schickst
Also freue weinachten erst mal und guten rutsch
:xmas2:
-
das werde ich wohl spasseshalber tun, und dann auch im forum von codeproject posten, damit die anderen entwickler sich das mal anschauen können.