1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Algorithmen und Lehrreiches

Automatische Sortierung Gridbox & Co.

  • H.Brill
  • 3. Dezember 2022 um 14:13
  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 3. Dezember 2022 um 14:13
    • #1

    Was nicht jeder weiß :

    Die automatische Sortierung bei den List - Controls geschieht ja

    nach ASCII, d. h. nach 1 kommt 10, 11, 12 usw. und nicht 2, 3, 4 usw.

    Wenn die Zahlen aber gleich lang gemacht werden (z.B.001 statt 1)

    so geht auch die Sortierung richtig. Das geht am besten mit Format$().

    Code
    Declare Handle grid, liste
    Window 500, 200
    grid = Create("Gridbox", %HWnd, "spalte 1;0;60;spalte 2;0;80;spalte 3;0;60", 1, 10, 10, 220, 100)
    liste = Create("Listbox", %HWnd, 1, 250, 10, 220, 100)
    WhileLoop 100, 1, -1
    AddString(grid, Format$("000", &LOOP) + "|" + "AAA" + "|" + "BBB")
    AddString(liste, Format$("000", &LOOP))
    EndWhile
    
    While 1
       Waitinput
    EndWhile
    Alles anzeigen

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Dezember 2022 um 17:28
    • #2

    Die Variante von Heinz ist natürlich schonmal sehr brauchbar.

    Noch besser wird sie (nur für Gridboxen), wenn man die erste Spalte (=Spalte 0) der Gridbox versteckt (also 0 Pixel breit macht) und dort die formatierte Version der Zahlen reinschreibt. In die 2. Spalte der Gridbox, welche die erste sichtbare ist, schreibt man dann die unformatierten. Diese sehen dann ebenfalls korrekt sortiert aus, weil immer nach der nun unsichtbaren Spalte 0 sortiert wird.

    Und man kann das ganze noch weiter auf die Spitze treiben. Mit der Message ~LVM_SORTITEMSEX und einer Callback-Funktion kann man fast beliebig sortieren. Hier ein Beispiel, das ohne versteckte 1. Spalte auskommt und trotzdem richtig sortiert:

    Code
    PROC SortGridCallbackProc
      Parameters Integer lParam1, lParam2, lParamSort
      Declare Integer erg
      erg=0
      If @Val(@GetText$(grid, lParam1, 0)) > @Val(@GetText$(grid, lParam2, 0))
        erg=1
      ElseIf @Val(@GetText$(grid, lParam1, 0)) < @Val(@GetText$(grid, lParam2, 0))
        erg=-1
      EndIf
      Return erg
    ENDPROC
    
    Declare Handle grid
    Declare Pointer hSortGridCallbackProc
    Window 500, 400
    grid = Create("Gridbox", %HWnd, "spalte 1;0;60;spalte 2;0;80;spalte 3;0;60", 0, 10, 10, 220, 300) 'zunächst UNsortierte Gridbox
    hSortGridCallbackProc = @ProcAddr("SortGridCallbackProc",3)
    WhileLoop 100, 1, -1
      AddString(grid, @Str$(&LOOP) + "|" + "AAA" + "|" + "BBB")
      @SendMessage(grid, 4177, 0, hSortGridCallbackProc) '4177=~LVM_SORTITEMSEX; hierhin, wenn schon beim Füllen der Gridbox sortiert werden soll (ist natürlich langsamer)
    EndWhile
    '@SendMessage(grid, 4177, 0, hSortGridCallbackProc) '4177=~LVM_SORTITEMSEX; hierhin, wenn erst nach dem Füllen der Gridbox sortiert werden soll (ist natürlich schneller)
    
    While 1
      Waitinput
    EndWhile
    
    @ProcAddr("SortGridCallbackProc",-3)
    End
    Alles anzeigen

    Siehe Microsoft-Hilfe: https://learn.microsoft.com/en-us/windows/…lvm-sortitemsex

    Gruß, Jens-Arne


    Und wenn wir den Geschwindigkeitsturbo zünden wollen, schreiben wir die Callback-Funktion in FreeBasic (benötigt JRPC3):

    Code
    {$PushFbDllGlobalLine TYPE S_LVITEMA}
    {$PushFbDllGlobalLine   mask As Integer}
    {$PushFbDllGlobalLine   iItem As Integer}
    {$PushFbDllGlobalLine   iSubItem As Integer}
    {$PushFbDllGlobalLine   state As Integer}
    {$PushFbDllGlobalLine   stateMask As Integer}
    {$PushFbDllGlobalLine   pszText As Any Pointer}
    {$PushFbDllGlobalLine   cchTextMax As Integer}
    {$PushFbDllGlobalLine   iImage As Integer}
    {$PushFbDllGlobalLine   lParam As Integer}
    {$PushFbDllGlobalLine   iIndent As Integer}
    {$PushFbDllGlobalLine   iGroupId As Integer}
    {$PushFbDllGlobalLine   cColumns As Integer}
    {$PushFbDllGlobalLine   puColumns As Integer}
    {$PushFbDllGlobalLine   piColFmt As Integer}
    {$PushFbDllGlobalLine   iGroup As Integer}
    {$PushFbDllGlobalLine END TYPE}
    
    fbPROC GetLVText(ByVal hLV As Integer, ByVal Zeile As Integer, ByVal Spalte As Integer) As String
      Dim As S_LVITEMA LVITEM
      Dim As String ret
      Dim As Byte Pointer pLVItemText
      pLVItemText = Allocate(2000)
      LVITEM.iItem = Zeile
      LVITEM.iSubItem = Spalte
      LVITEM.mask = 1 '1=LVIF_TEXT
      LVITEM.pszText = pLVItemText
      LVITEM.cchTextMax = 2000
      SendMessage(Cast(Any Pointer, hLV), 4141, Zeile, Cast(Integer, @LVITEM)) '4141=LVM_GETITEMTEXT
      ret=Peek(ZString, pLVItemText)
      Deallocate(pLVItemText)
      Return ret
    ENDPROC 'GetLVText
    
    fbPROC SortGridCallbackProc(ByVal lParam1 As LPARAM, ByVal lParam2 As LPARAM, ByVal lParamSort As LPARAM) As Integer Export
      Dim As Integer erg
      erg = 0
      If Val(GetLVText(grid, lParam1, 0)) > Val(GetLVText(grid, lParam2, 0))
        erg = 1
      ElseIf Val(GetLVText(grid, lParam1, 0)) < Val(GetLVText(grid, lParam2, 0))
        erg = -1
      EndIf
      Return erg
    ENDPROC 'SortGridCallbackProc
    
    Declare Handle grid SharedInfbProcs
    Declare Handle hDll
    Declare Pointer hSortGridCallbackProc
    Window 500, 400
    grid = Create("Gridbox", %HWnd, "spalte 1;0;60;spalte 2;0;80;spalte 3;0;60", 0, 10, 10, 220, 300) 'zunächst UNsortierte Gridbox
    hDll = @UseDll("test_fbprocs.dll")
    hSortGridCallbackProc = @External("Kernel32.dll", "GetProcAddress", @External("Kernel32.dll", "GetModuleHandleA", "test_fbprocs.dll"), "SORTGRIDCALLBACKPROC@12")
    WhileLoop 100, 1, -1
      AddString(grid, @Str$(&LOOP) + "|" + "AAA" + "|" + "BBB")
      @SendMessage(grid, 4177, 0, hSortGridCallbackProc) '4177=~LVM_SORTITEMSEX; hierhin, wenn schon beim Füllen der Gridbox sortiert werden soll (ist natürlich langsamer)
    EndWhile
    '@SendMessage(grid, 4177, 0, hSortGridCallbackProc) '4177=~LVM_SORTITEMSEX; hierhin, wenn erst nach dem Füllen der Gridbox sortiert werden soll (ist natürlich schneller)
    FreeDll hDll
    
    While 1
       Waitinput
    EndWhile
    
    End
    Alles anzeigen

    2 Mal editiert, zuletzt von Jens-Arne (14. Dezember 2022 um 18:08) aus folgendem Grund: Ein Beitrag von Jens-Arne mit diesem Beitrag zusammengefügt.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Dezember 2022 um 22:17
    • #3

    Das Profan-Programm muss im 2. Beispiel übrigens "test.prf" heißen, damit die FreeBasic-Dll bei UseDll und beim Ermitteln der Einsprungadresse der Callback-Funtion richtig benannt ist. Hier heißt sie entsprechend "test_fbprocs.dll". Wenn das Profan-Programm anders heißt, muss das entsprechend angepasst werden.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 12. Juni 2023 um 21:35
    • #4

    Ich habe jetzt mal eine DLL geschrieben, mit der man ohne versteckte Spalten alphabetisch, numerisch, beides und nach beliebigen Spalten und aufsteigend/absteigend sortieren kann. Die DLL ist beigefügt (

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.
    ), der XProfan-Beispielcode kommt hier:

    Code
    declare ende%,hB%[],hGB%,hGbSortDll%,hCBabsteigend%,absteigend%
    
    cls
    hGB%=@create("GRIDBOX",%HWnd,"Spalte 1;0;100;Spalte 2;0;100;Spalte 3;0;100",0,5,5,300,400)
    @AddString(hGB%,"1|Aaaa|Äh")
    @AddString(hGB%,"2|Au|Öh")
    @AddString(hGB%,"10|Binsen|Aha")
    @AddString(hGB%,"Ah|Ciao|Oh")
    @AddString(hGB%,"10|Effekt|Ahb")
    @AddString(hGB%,"Äh|Dorf|Uh")
    @AddString(hGB%,"10|Drall|Ahc")
    hB%[1]=@create("BUTTON",%HWnd,"Spalte 1 alphabetisch",310,5,317,20)
    hB%[2]=@create("BUTTON",%HWnd,"Spalte 1 numerisch",310,30,317,20)
    hB%[3]=@create("BUTTON",%HWnd,"Spalte 1 alphabetisch && numerisch",310,55,317,20)
    hB%[4]=@create("BUTTON",%HWnd,"Spalten 1 && 2 alphabetisch && numerisch",310,80,317,20)
    hB%[5]=@create("BUTTON",%HWnd,"Spalten 2 && 1 alphabetisch && numerisch",310,105,317,20)
    hB%[6]=@create("BUTTON",%HWnd,"Spalte 3 alphabetisch",310,130,317,20)
    hCBabsteigend%=@create("CHECKBOX",%HWnd,"absteigend",310,155,317,20)
    hGbSortDll%=@usedll("SortGridboxFast.dll") 'usedll muss sein, damit DLL-interne globale Variablen initialisiert und fortgeführt werden (die Sortierfunktion kann danach beliebig oft aufgerufen werden)
    usermessages $10
    ende%=0
    whilenot ende%
      waitinput
      if @getcheck(hCBabsteigend%)
        absteigend%=1
      else
        absteigend%=0
      endif
      if @clicked(hB%[1])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%,"0|1",absteigend%) 'Syntax: SortGridboxFast(hGridBox,"[Spalte[|Art]][,[Spalte[|Art]]][,...]",absteigend) - Spalte: nullbasierte Spaltennummer; Art=1: alphabetisch, Art=2: numerisch, Art=3: beides; absteigend=0: aufsteigend; absteigend=1: absteigend
        @setfocus(%HWnd)
      elseif @clicked(hB%[2])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%,"0|2",absteigend%)
        @setfocus(%HWnd)
      elseif @clicked(hB%[3])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%,"0|3",absteigend%)
        @setfocus(%HWnd)
      elseif @clicked(hB%[4])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%," 0|3,1|3",absteigend%) 'es wird zuerst nach Spalte 0 sortiert; wenn darin gleiche Werte vorhanden sind, werden diese nach Spalte 1 weitersortiert
        @setfocus(%HWnd)
      elseif @clicked(hB%[5])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%,"1|3,0|3",absteigend%) 'es wird zuerst nach Spalte 1 sortiert; wenn darin gleiche Werte vorhanden sind, werden diese nach Spalte 0 weitersortiert
        @setfocus(%HWnd)
      elseif @clicked(hB%[6])
        @external("SortGridboxFast.dll","SortGridboxFast",hGB%,"2|1",absteigend%)
        @setfocus(%HWnd)
      elseif (%uMessage=$10) or @iskey(27)
        ende%=1
        while @iskey(27)
          sleep 25
        endwhile
      endif
    endwhile
    freedll hGbSortDll%
    end
    Alles anzeigen

    Man kann so z.B. festlegen, dass erst nach Spalte 0 (die erste Spalte) alphabetisch und numerisch aufsteigend sortiert werden soll, und wenn darin gleiche Werte vorkommen, sollen diese z.B. nach Spalte 7 (die achte Spalte) weitersortiert werden, und wenn darin gleiche Werte vorkommen, nach Spalte XY, und so weiter...

    Die Syntax ist wie folgt:

    SortGridboxFast(hGB, "<Spalte>|<Sortiermodus>,<Spalte>|<Sortiermodus>,...", auf/absteigend)

    Parameter:

    hGB: Handle der Gridbox, die sortiert werden soll

    Definitionsstring: beliebig viele Paare aus nullbasierter Spaltennummer und Sortiermodus, wobei Modus=1: alphabetisch, =2: numerisch, =3: beides; es wird zuerst nach der ersten, dann nach der zweiten angegebenen Spalte usw. sortiert, die Reihenfolge ist also wichtig (Leerstring=Spalte 0, Modus 3)

    auf/absteigend: 0=aufsteigend, 1=absteigend

    Wichtig: Die Funktion der DLL darf nicht mit DEF nach XProfan übernommen werden, da sonst die automatische Typumwandlung des Definitionsstrings nicht funktioniert. Oder man muss statt des Strings eine Bereichsvariable mit dem String darin übergeben.

    Wer sich für den Quellcode der DLL interessiert, für den JRPC3 und PureBasic erforderlich sind, kann ihn sich hier ansehen:

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Gruß, Jens-Arne

    7 Mal editiert, zuletzt von Jens-Arne (12. Juni 2023 um 21:53)

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 13. Juni 2023 um 07:22
    • #5

    Hallo,

    mach noch eine Datums- und Zeitsortierung rein, dann wäre es super perfekt.

    Dann bräuchte man zum Sortieren nicht mehr als erstes ins Datenbankformat

    umwandeln. Gewisse Regeln muß der Anwender dann schon einhalten. Also

    deutsches Format (tt.mm.jjjj.std.min., sec, hsec).

    Auch separat Datum, Zeit und gemischt.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 13. Juni 2023 um 13:33
    • #6

    Hallo Heinz,

    ok, ist erledigt:

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Es gibt jetzt drei weitere Sortierungstypen:

    4: Datum (Trennzeichen dürfen ".", "/" und "-" sein; die Jahreszahl muss in allen Felder entweder zwei- oder vierstellig sein)

    5: Zeit (Trennzeichen ":" oder ".", auch gemischt; Stunden:Minuten[:Sekunden[.Millisekunden]])

    6: Datum & Zeit (Trennzeichen ".", "/", "-", ":", " ")

    Um das Datumsformat anzugeben, gibt es zudem eine neue Funktion:

    @external("SortGridboxFast.dll","SetDateType",Type)

    Type=1: TT.MM.JJ[JJ] (Default)

    Type=2: MM/TT/JJ[JJ]

    Type=3: JJ[JJ].MM.TT

    Sourcecode:

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Ich hoffe, es funktioniert alles. Ich habe ein bisschen getestet, aber nicht allzu intensiv, weil es so viele verschiedene Möglichkeiten gibt.

    Wenn man in dem Beispiel nach dem Datum in Spalte 1 sortiert, liegt "2" zwischen zwei Daten. Das ist kein Bug. Normalerweise wären in der Spalte ja nur Datumsangaben enthalten, da würde alles zutreffend sortiert.

    Gruß, Jens-Arne

  • p. specht
    Premium-Mitglied
    Reaktionen
    986
    Beiträge
    5.665
    • 13. Juni 2023 um 14:11
    • #7

    Tolle Sache!!!

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 13. Juni 2023 um 17:50
    • #8

    Wie bekomme ich jetzt die 3.Spalte alphabetisch sortiert ?

    Code
    Declare Handle hdll, GB, btn1, btn2, Long ende
    
    hdll = ImportDLL("SortGridboxFast.dll", "")
    Window 600, 400
    btn1 = Create("Button", %HWnd, "Sort", 10, 10, 60, 25)
    btn2 = Create("Button", %HWnd, "Ende", 100, 10, 60, 25)
    GB =   Create("Gridbox", %HWnd, "Datum;0;120;Menge;0;60;Artikel;0;120", 0, 10, 50, 320, 200)
    
    ende = 0
    AddElements()
    
    WhileNot ende
       WaitInput
       If Clicked(btn1)
          SetDateType(1)
          SortGridboxFast(GB, "0|4,1|2,2|1", 1)
       ElseIf Clicked(btn2)
          ende = 1
       EndIf
    EndWhile
    
    Proc AddElements
      AddString(GB, "13.06.2022|10|Weck")
      AddString(GB, "20.12.2023|20|Brote")
      AddString(GB, "05.05.2021|30|Teilchen")
    EndProc
    FreeDll hdll
    
    End
    Alles anzeigen

    Also, ich würde vorschlagen, immer nur eine Spalte zu sortieren, sowie es bei X4 SortList auch macht.

    Daß man mehrere Spalten gleichzeitig sortiert haben möchte, macht wohl weniger Sinn. Später eine

    andere Spalte nachsortieren kann man dann immer noch. Man kann ja auch leicht dem Nutzer seines

    Programmes mehrere Varianten zum Sortieren anbieten.

    PS: Wenn man bei SortGridboxFast den letzten Parameter (0|1) vergißt, steigt der Interpreter und

    die DLL wortlos aus.

    Ansonsten schon wegen der kleinen Größe der DLL super.

    Diese beiden Funktionen hast du auch exportiert :

    Spoiler anzeigen

    JRPC3_Init4

    SortCallback


    Sind die auch nutzbar (besonders das Callback) ?

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 14. Juni 2023 um 09:18
    • #9

    Habe es jetzt rausgefunden.

    Man kann auch bei SortGridboxFast() nur die Spalte mit Sortiermodus angeben, die man

    sortieren will. Das sollte dann später auch in deine Doku einfließen, um Mißverständnisse

    zu vermeiden.

    Man kann es ja auch toll zum Sortieren von Arrays nutzen :

    Code
    Declare Handle hdll, GB, String Dates[]
    
    hdll = ImportDLL("SortGridboxFast.dll", "")
    Window 600, 400
    GB =   Create("Grid", 1, 0)
    
    AddDates()
    CLEARLIST
    Move("ArrToList", Dates[])
    Move("ListToHandle", GB)
    SetDateType(1)
    SortGridboxFast(GB, "0|4", 0)
    CLEARLIST
    Move("HandleToList", GB)
    Clear Dates[]
    
    Move("ListToArr", Dates[])
    WhileLoop 0, SizeOf(Dates[]) - 1
      Print Dates[&LOOP]
    EndWhile
    
    Waitkey
    
    Proc AddDates
      Dates[0] = "13.06.2022"
      Dates[1] = "20.12.2023"
      Dates[2] = "05.05.2021"
      Dates[3] = "31.12.2001"
      Dates[4] = "14.08.2002"
    EndProc
    FreeDll hdll
    
    End
    Alles anzeigen

    Somit ist das Teil doch noch genial.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Juni 2023 um 09:21
    • #10

    Wenn Du nach der dritten Spalte alphabetisch aufsteigend sortieren möchtest, dann muss das so aussehen:

    SortGridboxFast(GB, "2|1", 0)

    Es wird ja immer zuerst nach der ersten angegebenen Spalte sortiert, dann nach der zweiten, aber nur, wenn es in der ersten Spalte gleichlautende Einträge gibt. Und Du hast Recht: Normalerweise wird man wohl nur nach einer Spalte sortieren. Mehrere braucht man sicher nur für Spezialanwendungen.

    Wenn man bei DLL-Funktionen einen Parameter vergisst, gibt es immer einen wortlosen Absturz. Das ist bei allen DLLs so, auch bei API-Funktionen.

    Die beiden anderen exportierten Funktionen, die Du genannt hast, darf man nicht selbst benutzen. JRPC3_Init4 kommt von JRPC3 (damit werden einige XProfan-Systemvariablen verfügbar gemacht, z.B. %HWnd). Die Callbackfunktion wird von SortGridboxFast an ~LVM_SORTITEMSEX übergeben. Die kann man von außen nicht sinnvoll füttern, das macht SortGridboxFast. SortCallback muss eigentlich gar nicht exportiert werden, in künftigen Versionen wird das auch so sein, danke für den Hinweis.


    Was ich noch vergessen habe zu erwähnen: Die Sortierung nach Datum und Zeit funktioniert auch dann, wenn man keine führenden nullen verwendet (also z.B. 1.3.2023 statt 01.03.2023 und 7:45 statt 07:45). Allerdings sieht es mit nullen natürlich wesentlich übersichtlicher aus, weil die Einträge dann alle gleich lang sind.

    Einmal editiert, zuletzt von Jens-Arne (14. Juni 2023 um 09:26) aus folgendem Grund: Ein Beitrag von Jens-Arne mit diesem Beitrag zusammengefügt.

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 14. Juni 2023 um 10:41
    • #11
    Zitat von Jens-Arne

    Wenn man bei DLL-Funktionen einen Parameter vergisst, gibt es immer einen wortlosen Absturz. Das ist bei allen DLLs so, auch bei API-Funktionen.

    Das ist in der Tat in XProfan beim Aufruf der API und DLL-Funktionen genauso.

    Immerhin kann man das in XProfan in einer Proc...EndProc kapseln und mit pType$() und %PCount überprüfen.

    Da scheint (X)Profan doch schon vor einiger Zeit fortschrittlich gewesen zu sein.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Juni 2023 um 11:21
    • #12

    Und jetzt guck Dir das mal an (auf die Headerüberschriften klicken, 1. Klick=aufsteigen sortieren, 2. Klick=absteigend sortieren, ...):

    EDIT: Jetzt auch mit Pfeilen für die Visualisierung der Sortierung.

    Code
    $H windows.ph
    $H messages.ph
    
    Declare Handle hdll, GB, btn1, btn2, Long ende, Memory NMLV, LVCO, ws, Long oldNMLV, ColClicked
    Declare Long i, SortDirection[], SortMode[], String ColTitle[]
    
    STRUCT S_NMLISTVIEW = hwndFrom&, idFrom&, code&, iItem&, iSubItem&, uNewState&, uOldState&, uChanged&, ptActionX&, ptActionY&, lParam&
    STRUCT S_LVCOLUMNW = mask&, fmt&, cx&, pszText&, cchTextMax&, iSubItem&, iImage&, iOrder&, cxMin&, cxDefault&, cxIdeal&
    
    SUBCLASSPROC
      If %sMessage=~WM_NOTIFY
        NMLV=&slParam
        If NMLV.code& = -108 '-108=~LVN_COLUMNCLICK
          ColClicked = NMLV.iSubItem&
          @SendMessage(%HWnd, $8000, 0, 0) 'verlässt WaitInput
        EndIf
      EndIf
    ENDPROC
    
    Proc AddElements
      AddString(GB, "13.06.2022|10|Weck")
      AddString(GB, "20.12.2023|20|Brote")
      AddString(GB, "05.05.2021|30|Teilchen")
    EndProc
    
    hdll = ImportDLL("SortGridboxFast.dll", "")
    Window 600, 400
    btn1 = Create("Button", %HWnd, "zum Sortieren Spaltenüberschrift anklicken", 10, 10, 300, 25)
    btn2 = Create("Button", %HWnd, "Ende", 320, 10, 60, 25)
    GB =   Create("Gridbox", %HWnd, "Datum;0;120;Menge;0;65;Artikel;0;120", 0, 10, 50, 325, 200)
    SortMode[0] = 4 : SortDirection[0] = 0 : ColTitle[0] = "Datum"
    SortMode[1] = 2 : SortDirection[1] = 0 : ColTitle[1] = "Menge"
    SortMode[3] = 1 : SortDirection[2] = 0 : ColTitle[2] = "Artikel"
    SetStyle @SendMessage(GB, 4127, 0, 0), $50000002 'Header aktivieren; 4127=~LVM_GETHEADER
    dim NMLV, S_NMLISTVIEW
    oldNMLV = NMLV
    dim LVCO, S_LVCOLUMNW
    dim ws, 1000
    UserMessages $8000 'zum intentionalen Verlassen von WaitInput
    ColClicked = -1
    
    ende = 0
    AddElements()
    
    SubClass %HWnd, 1
    WhileNot ende
      WaitInput
      'If Clicked(btn1)
      '   SetDateType(1)
      '   SortGridboxFast(GB, "0|4,1|2,2|1", 1)
      If Clicked(btn2)
         ende = 1
      ElseIf ColClicked<>-1
        SortGridboxFast(GB, @str$(ColClicked)+"|"+@str$(SortMode[ColClicked]), SortDirection[ColClicked])
        For i, 0, 2
          If i = ColClicked
            If SortDirection[ColClicked]=0
              WideString ws, 0 = ColTitle[ColClicked] + " " + @chr$($25BC)
            Else
              WideString ws, 0 = ColTitle[ColClicked] + " " + @chr$($25B2)
            Endif
          Else
            WideString ws, 0 = ColTitle[ColClicked]
            SortDirection[i] = 0
          EndIf
          LVCO.mask&=4 '4=~LVCF_TEXT
          LVCO.pszText&=@Addr(ws)
          @SendMessage(GB, 4192, i, LVCO) '4192=~LVM_SETCOLUMNW
        EndFor
        SortDirection[ColClicked] = 1-SortDirection[ColClicked] 'auf-/absteigend umkehren
        ColClicked = -1
      EndIf
    EndWhile
    SubClass %HWnd, 0
    
    NMLV=oldNMLV
    dispose NMLV, LVCO, ws
    FreeDll hdll
    End
    Alles anzeigen

    2 Mal editiert, zuletzt von Jens-Arne (14. Juni 2023 um 12:22)

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Juni 2023 um 12:39
    • #13

    Was muss man eigentlich machen, um einen eigenen Beitrag länger als eine Stunde bearbeiten zu können? Gibt es da bestimmte Zugriffsrechte, die man gesetzt bekommen kann?

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 14. Juni 2023 um 12:50
    • #14

    Das mit den Header-Pfeilen, so wie in Franks Listview.dll wollte ich auch erwähnen,

    dachte aber, daß es zuviel Arbeit macht. Aber da du ja selber drauf gekommen bist,

    ... super.

    Das mit der nur kurzfristigen Bearbeitung der eigenen Beiträge geht mir auch manchmal

    auf den Keks. Kostet nur unnötige Neu-Postings.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.892
    Beiträge
    6.855
    • 14. Juni 2023 um 16:54
    • #15

    Die zeitliche Grenze haben wir so eingebaut, weil es immer wieder Zeitgenossen gibt, die einen unverfänglichen Beitrag schreiben und dann irgendwann später versuchen, dort Werbelinks unterzubringen.

    Gruß Volkmar

  • Jens-Arne
    Ist öfter hier
    Reaktionen
    91
    Beiträge
    113
    • 14. Juni 2023 um 17:59
    • #16

    Ok, das ist wirklich eine Sauerei. Von daher verstehe ich diese Grenze. Gibt es eine Möglichkeit, für bekanntermaßen vernünftige Mitglieder die Grenze aufzuheben? Also z.B. für Heinz und für mich und sicher noch für ein paar andere?

    Gruß, Jens-Arne

  • Volkmar
    Moderator
    Reaktionen
    6.892
    Beiträge
    6.855
    • 14. Juni 2023 um 18:01
    • #17

    Das glaube ich nicht. Wäre dann eine Frage an den Admin.

    Gruß Volkmar

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™