Nach Attributen sortieren

German support forum

Moderators: Hacker, Stefan2, white

Norton
Junior Member
Junior Member
Posts: 84
Joined: 2003-09-03, 20:08 UTC

Nach Attributen sortieren

Post by *Norton »

Wieso ist eigentlich die Spalte mit den Attributen nicht sortierbar? Ich brauche es sehr oft, dass ich in einem Verzeichnis z.b. die schreibgeschützten untereinander stehen haben möchte, oder alle mit dem Archivbit usw...

Am besten wäre es, wenn man bei jedem Klick auf die Attributspalte die Reihenfolge (und somit Sortierung) der Attribute toggeln könnte.

Ist sowas umsetzbar? Mir würde es ja schon reichen, wenn einfach nur das Sonderhandling aufgehoben werden würde, nicht auf die Attibutspalte klicken zu können ;)
User avatar
norfie
Power Member
Power Member
Posts: 1194
Joined: 2003-02-18, 14:18 UTC

Post by *norfie »

Last edited by norfie on 2004-09-11, 07:58 UTC, edited 1 time in total.
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Temporärer Filter

Post by *MikeTheGuru »

Dieses Problem hatte ich auch schon vor eppa einem Jahr zur Diskussion gestellt und dieselben Antworten bekommen...

Ich gebe Ch.Ghisler recht: es gibt keine intuitive Sortlogik für Attribute.

Der Weg, einen benutzerdefinierten Filter zu verwenden, ist an und für sich gut (wenngleich ein kurzer Weg Filter für Attribute wie in den verschiedenen Postings angezogen noch besser wäre).

Doch die benutzerdefinierten Filter ermangeln IMHO eines wesentlichen Features: Es gibt keine Möglichkeit, einen temporären Filter zu erstellen!

Der jetzige Weg ist:

ctrl-F12
'Define...' Button
(Filter definieren)
'Save' mit einem an sich bedeutungslosen Namen
(diesen Namen in der Liste dann suchen anklicken)
'Ok' drücken

Viel userfreundlicher wäre folgender Weg:

ctrl-F12
'Define...' Button
(Filter definieren)
neuen 'Use'-Button drücken

und fertig - die Anzeige ist entsprechend gefiltert.

Wenn man eine bestimmte Attribut-Kombination häufiger braucht, steht es jedermann frei, dafür einen intuitiv benannten Filter sich anzulegen und echt zu speichern.

Ich denke, daß dieses (IMHO nicht allzuschwer implentierbare Feature) den an sich genialen Filter noch genialer machen würde ;-)
Last edited by MikeTheGuru on 2004-04-07, 13:12 UTC, edited 1 time in total.
MikeTheGuru
RegNr #48208
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Intuitive Sortiermöglichkeit für Attribute

Post by *MikeTheGuru »

Wenn man Attribute tatsächlich sortiert haben will/muß, gäbe es folgende Möglichkeit die Suchreihenfolge individuell anzugeben:

Für jedes mögliche Attribut gibt man (also dort, wo man jetzt die Häkchen setzen kann), entweder ein:
* einen Großbuchstaben für 'gesetzt/nicht gesetzt'
* einen kleinbuchstaben für 'nicht gesetzt/gesetzt'
* eine '0' für 'Nicht gesetzt'
* eine '1' für 'Gesetzt'
* Blank für egal

Nach der Eingabe wäre zu prüfen, ob Buchstaben (unabhängig von der Schreibweise) eindeutig sind (dh. es dürfen zB. keine zwei oder mehr 'B' oder 'b' vorkommen).

Die Attributfilterung läuft dann so ab:

Für jeden vorhandenen Fileentry wird das Attribut-Byte wie folgt temporär geändert (Bitreihenfolge von links nach rechts):
1) Ist für ein Attributbit '1' oder '0' eingegeben worden, aber das aktuelle Bit paßt nicht, so wird dieser Eintrag verworfen
2)In der Reihenfolge des Alphabetes wird für jeden verwendeten Buchstaben (sind max.8 Buchstaben - der Performance wegen vorher zu normieren) bei Großbuchstabe das entsprechende Original-Attributbit invertiert (!!) übernommen, bei Kleinbuchstaben original übernommen.
3) Alle anderen Attributbits werden 1:1 übernommen

Dann wird nach dieser temporären Attributwerten sortiert.

Zum Beispiel:
Man hätte gerne alle Read-Only-Files, und innerhalb dieser sortiert nach 1) System-Files (nein/ja) und 2) Hidden (ja/nein).

Dann gibt man zB. ein:
System-Attribute: 'a'
Hidden-Attribute: 'D'
Read-Only: '1'

Man beachte: es ist nicht zwingend, sich genau an das ABC zu halten - es kommt auf die relative Position der Buchstaben an!

Dann passiert folgendes:

1)Alle Zeilen ohne gesetztem Readonly-Bit werden verworfen.
2)Erzeugen der Inverter-Maske '01000000'B (1.Sortierspalte: System-unverändert, 2.Sortierspalte:Hidden-invertiert).
3)Jedes (noch) vorhandene Attributbyte wird temporär bitweise wie folgt umgesetzt:
SHxxxxxx
wobei die 'xxxxxx' die restlichen Attributbits in beliebiger Reihenfolge sind
4)Das temporäre Attributbyte wird mit der generierten Invertermaske '01000000'B XORed (Hidden-Attribut ist zu invertieren!).
5)Nach diesem temporären Attributebyte sortieren.

In der Zeilen-Anzeige als solche greift man wieder auf die Original-Attribute zu, um diese anzuzeigen, dort bedarf es also keiner Kenntnis der Sortierfolge (und der dadurch geänderten Bitfolge des temporären Attributebytes) mehr.

Eine derartige Angabe von willkürlichen Sortattributen habe ich schon mal implementiert, ist anspruchsvoll aber nicht wirklich schwer. Dort handelte es sich um eine Datenbankabfrage, wo man echte Vergleiche anstellen mußte.

Hier könnte ich mir vorstellen, daß es wesentlich performanter wäre, auf Grund der Eingaben eine 256-stellige Translatetabelle zu generieren und dann jedes Attributbyte einfach zu übersetzen. Auch die Invertierung ließe sich dann dort verpacken und damit ein weiterer Schritt einsparen.

Wäre doch 'ne echte Herausforderung das auch im TC zu implementieren ;-)
MikeTheGuru
RegNr #48208
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Post by *MikeTheGuru »

Nachsatz zu meinen obigen Ausführungen:

Temporäre Attribute-Bytes müssen ohnehin auf irgendeine zumindest rudimentäre Art vorhanden sein:

Die bereits bestehende Unterscheidung
Gesetzt/Nicht_gesetzt/Egal
kann ja nur auf diese oder ähnliche Art gelöst werden:

1)Maskieren aller 'egal'-Bits auf '0' (via AND) oder '1' (via OR) mit Hilfe einer den Eingaben entsprechenden generierten Maske
2)Invertieren der - je nach Ziel '0' oder '1' - 'gesetzten' resp. 'nicht_gesetzten' Bits
3)Vergleich auf X'FF' oder X'00'

Die Zusatzaufgabe ist also nur, die Reihenfolge der Bits den Userangaben entsprechend zu ändern.
MikeTheGuru
RegNr #48208
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Post by *MikeTheGuru »

Weil's mich gereizt hat...

Hier eine C++-class die genau das tut ;-)
(Hoffe, es stört nicht, hier Programmteile zu posten...)

Code: Select all

/*** Erstellen Sortierbyte nach Uservorgaben **DCL**/
typedef class SortBits
{ // --friends
//- Fields
private:
char xTable[256];
public:
//-Structors
SortBits();
//-Operators
//-Methods
public:
/** SetSortOrder :: Sortierordnung festlegen *** DCL **/
char SetSortOrder ( // Sortierordnung festlegen
  const char* WantedOrder // Gewünschte Sortierfolge
);
/** TranslateByte :: Byte umsetzen *** DCL **/
char TranslateByte ( // Byte umsetzen
  const char ToTranslate // umzusetzendes Attribute-Byte
);
} SortBits; //! Erstellen Sortierbyte nach Uservorgaben

/** SortBits::SetSortOrder (Sortierordnung festlegen)  *** BEG **/
char SortBits::SetSortOrder ( // Sortierordnung festlegen
  const char* WantedOrder // Gewünschte Sortierfolge
) { // Sortierordnung festlegen
char RC_Wert; // Returnwert
int i,j;
char Tab26[26]; /* Sortiereingaben in Alpha-Folge */   
char TabAtt[8]; /* Angaben pro Attribut */
char TabRest[8]; /* Restattribute */
char TabMask[8]; /* Maskenbits */
char Order;
//--- Code (no exceptions)
memset(Tab26,0,26);   
Order=0;
RC_Wert=0;
for (i=0; // Alle Usereingaben
     i<8;
     i++) { // Alle Usereingaben
  if(!WantedOrder[i]) { // String zu Ende
    return(0xFF); /* Zu wenig Zeichen */ 
    }; // String zu Ende
  char Letter=WantedOrder[i];
  if(Letter>='A' && Letter<='Z') { // Grossbuchstabe
    if(Tab26[Letter-'A']) { // Bereits besetzt
      return(Letter); /* Doppelt besetzt */
      }; // Bereits besetzt
    Tab26[Letter-'A']=i+17; /* Invers-Sortierung */
    } // Grossbuchstabe
  elif(Letter>='a' && Letter<='z') { // Kleinbuchstabe
    if(Tab26[Letter-'a']) { // Bereits besetzt
      return(Letter); 
      }; // Bereits besetzt
    Tab26[Letter-'a']=i+1; /* Standard-Sortierung */
    } // Kleinbuchstabe
  else { // NOT Grossbuchstabe
    if(!strchr("01 ",Letter)) { // Kein erlaubtes Zeichen
      return(Letter); 
      }; // Kein erlaubtes Zeichen
    }; // NOT Grossbuchstabe
  }; // Alle Usereingaben
/* In Tab26 stehen nun die Sortpositionen */
for (j=0; // Prefill
     j<8;
     j++) { // Prefill
  TabRest[j]=j+1; 
  }; // Prefill
j=0;
for (i=0; // Komprimieren
     i<26;
     i++) { // Komprimieren
  if(Tab26[i]) { // Eintrag vorhanden
    char Swap=Tab26[i] & 0x0F;
    TabAtt[j]=Tab26[i]; 
    TabRest[Swap-1]=0;
    j++;
    }; // Eintrag vorhanden
  }; // Komprimieren
for (i=0; // Rest übertragen
     i<8;
     i++) { // Rest übertragen
  if(TabRest[i]) { // Rest vorhanden
    TabAtt[j++]=TabRest[i]; 
    }; // Rest vorhanden
  }; // Rest übertragen
/* Maskenbits erzeugen */
for (i=0; // Alle Sortbytes
     i<8;
     i++) { // Alle Sortbytes
  int Shift=TabAtt[i] & 0x0F;
  int Wert=0x100>>Shift;
  TabMask[i]=Wert;
  }; // Alle Sortbytes
/* Generierung der xLate-Tabelle */
for (i=0; // Alle Einträge
     i<256;
     i++) { // Alle Einträge
  char xx=0;
  char TestBit=0x80;
  for (j=0; // Bits abarbeiten
       j<8;
       j++) { // Bits abarbeiten
    if((i&TestBit) && !(TabAtt[j]&0x10)
       ||
       !(i&TestBit) && (TabAtt[j]&0x10)
       ) { // Bit ohne Inversion
        xx|=TabMask[j]; 
        } // Bit ohne Inversion
    TestBit>>=1;
    }; // Bits abarbeiten
  xTable[xx]=i;
  }; // Alle Einträge
return(RC_Wert);
}; // Sortierordnung festlegen
/** SortBits::SetSortOrder (Sortierordnung festlegen)  *** END **/

/** SortBits::TranslateByte (Byte umsetzen)  *** BEG **/
char SortBits::TranslateByte ( // Byte umsetzen
  const char ToTranslate // umzusetzendes Attribute-Byte
) { // Byte umsetzen
//--- Code (no exceptions)
return(xTable[ToTranslate]);   
}; // Byte umsetzen
/** SortBits::TranslateByte (Byte umsetzen)  *** END **/

SortBits::SortBits( // Default-Constructor 
) {
int i;
for (i=0; // FOR_@@134
     i<256;
     i++) { // FOR_@@134
  xTable[i]=i;   
  }; // FOR_@@134
}; // Default-Constructor
Verwendung:
Es kann die Sortierfolge von Bytes wie weiter oben durch Angabe der bitweisen Sortorder definiert werden:
An jeder Bitposition einen Buchstaben eintragen, wobei GROSSBUCHSTABEN bedeuten '1 vor 0' und kleinbuchstaben '0 vor 1'. Die bits werden in alphabetischer Reihenfolge dieser Buchstaben umgestellt und - falls nötig - invertiert. Unberücksichtigte Bits bleiben in der alten Ordnung.

Code: Select all

/** TestTranslate (Testfunktion)  *** BEG **/
static void TestTranslate ( // Testfunktion
  const char* UserOrder // Gewünschte Sortierfolge
) { // Testfunktion
SortBits MeineBits;
char xx;
int i,j;
//--- Code (no exceptions)
printf("\nSortorder: (%s)=\n",UserOrder);
xx=MeineBits.SetSortOrder(UserOrder);
if(xx) { // Ging was schief...
  printf("Letter=%c (%02X)\n",xx,xx);
  return;
  }; // Ging was schief...
xx=0;
for (i=0; // Left nibble
     i<16;
     i++) { // Left nibble
  printf("%X*->:",i);
  for (j=0; // Right nibble
       j<16;
       j++) { // Right nibble
    printf(" %02X",MeineBits.TranslateByte(xx));
    xx++;
    }; // Right nibble
  printf("\n");
  }; // Left nibble
}; // Testfunktion
/** TestTranslate (Testfunktion)  *** END **/

/*** Hauptfunktion ***/
int main(
  int argc // Anzahl Argumente
, const char** argv // Argumentenliste
, const char** arge // Environmentliste
) {
int RC=0; // Returncode
//--- Code
TestTranslate("       a"); // Zuerst 'gerade', dann 'ungerade' bytes
TestTranslate("A       "); // Zuerst die 'obere', dann die 'untere' Hälfte
TestTranslate(" D b    "); // Irgendwas gemischtes zum Prüfen...
TestTranslate("abCDefGH"); // Mixturen aus normal und inverted
TestTranslate("efGHABDC");
TestTranslate("efHGABDC");
TestTranslate("zrqomkji"); // Bits von rechts nach links spiegeln
TestTranslate("ZRQOMKJI"); // Wie oben und außerdem invertieren
TestTranslate("abcdijkl"); // Normale Sortfolge (alles unverändert)
TestTranslate("ABCDIJKL"); // Alles invertiert (umgekehrte Sortierung)
return(RC);
}; // main
In der hier vorliegenden Version wird grundsätzlich eine Translate-Tabelle aufgebaut.
Alternativ kann, wenn bekannt ist, daß nur wenige Bytes umzusetzen sind, (aus Performancegründen) die Translatefunktion als solche ebenfalls exportiert werden und nur punktuell angewandt werden. Bleibt dem letztendlichen Implementierer überlassen wie er's gern hätte...

Verwendung dieses Codes erlaubt und erbeten ;-)
MikeTheGuru
RegNr #48208
Norton
Junior Member
Junior Member
Posts: 84
Joined: 2003-09-03, 20:08 UTC

Re: Temporärer Filter

Post by *Norton »

> Dieses Problem hatte ich auch schon vor eppa einem Jahr zur Diskussion gestellt und dieselben Antworten bekommen...

Die Diskussion wird immer wieder kommen. Ich mein, es wurde ja offenbar EXTRA das Handling eingebaut das man eben NICHT auf die Attributspalte klicken kann. Solls doch einfach rausgenommen werden. Wer nicht nach sortieren will, klickt halt nich.

> Ich gebe Ch.Ghisler recht: es gibt keine intuitive Sortlogik für Attribute.

Die einfachste wäre, die Attributanzeige stringbasiert zu behandeln UND in den Optionen die Reihenfolge festlegen zu können (RAHSC, ACRSH, CARHS....) In den meisten Fällen machts doch nur Sinn, entweder die schreibgeschützten vorne zu haben oder die mit Archivbit.

Alle Umwege über Datei-suche oder Filterung kann ich nich gebrauchen :-/
Im Übrigen kann sogar der Explorer nach Attributen sortieren (!) der machts übrigens Alphabetisch....
Vielleicht kann man ja wenigstens die Sonderbehandlung des Nicht-Klickens über einen Hidden-INI-Eintrag abschalten? Wär supertoll...

greetings
User avatar
norfie
Power Member
Power Member
Posts: 1194
Joined: 2003-02-18, 14:18 UTC

Post by *norfie »

Last edited by norfie on 2004-09-11, 08:01 UTC, edited 1 time in total.
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Post by *MikeTheGuru »

@Norton:

Das ist im Prinzip mein Vorschlag.

Ob man die Sortierreihenfolge jetzt festlegt, indem man den einzelnen Attributen ein Gewicht verleiht, oder indem man die gewünschte Reihenfolge direkt hinschreibt bleibt im Prinzip gleich. Wenn man sich's genauer überlegt, ist Dein Vorschlag sogar irgendwie noch intuitiver.

Wenn man darüber hinaus noch den Unterschied GROSS- und kleinbuchstaben für die Sortierreihenfolge einfügt, hat man die perfekte Lösung.

Die technische Umsetzung habe ich bereits gepostet ;-)

Hoffen wir, daß das in einer kommenden Release auch so eingebaut wird!
MikeTheGuru
RegNr #48208
Norton
Junior Member
Junior Member
Posts: 84
Joined: 2003-09-03, 20:08 UTC

Post by *Norton »

norfie wrote:Ist eher historisch bedingt und es gibt keine EXTRA Behandlung.
Ich meinte eher das Extra-Handling, das in dieser nachprogrammierten ListView (THeaderClick) Komponente kein Klick auf der Attributspalte zugelassen wird. (oder ist es anders rum, das nur Events auf den anderen Spalten zugewiesen sind und standardmässig klein Klick aktiv ist?)
Naja egal... Wär jedenfalls schön wenn es ginge ;p
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

(oder ist es anders rum, das nur Events auf den anderen Spalten zugewiesen sind und standardmässig klein Klick aktiv ist?)
Ich denke, es ist eher so, weil es kein ListView sondern eine ListBox ist und die Header sind AFAIK Christians eigene Komponenten (so einen Pfeil gibt es bei den Standardkomponenten soweit ich weiss nicht).

HTH
Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
Norton
Junior Member
Junior Member
Posts: 84
Joined: 2003-09-03, 20:08 UTC

Post by *Norton »

MikeTheGuru wrote: Die technische Umsetzung habe ich bereits gepostet ;-)
Ja, aber TC ist in Delphi und nich in C geschrieben =)
MikeTheGuru wrote: Hoffen wir, daß das in einer kommenden Release auch so eingebaut wird!
Das hoffe ich seit Ewigkeiten bei jedem Release ;)

Nochn Vorschlag: Rechter Mausklick auf dieser THeaderClick-Komponente ist ja im Moment noch gar nicht zugeordnet. Da könnte man ein Popup-Menü dran hängen, das bei Attributen halt den Reihenfolgeeingabedialog bringt, bei Datum die Auswahl ob Last Access, Writetime oder Creation, bei Dateigrösse die Ansicht nach Byte, KB, MB und Automatisch, bei Extension ob An, Aus oder die im Explorer angezeigte Art der Erweiterung und beim Namen fällt mir sicher auch noch was ein.... ;)

greetings
shammat
Senior Member
Senior Member
Posts: 253
Joined: 2003-04-11, 23:13 UTC

Re: Temporärer Filter

Post by *shammat »

MikeTheGuru wrote:Ich gebe Ch.Ghisler recht: es gibt keine intuitive Sortlogik für Attribute.
Die Frage ob es eine intuitive gibt oder nicht, finde ich eigentlich gar nicht wichtig.

Ziel einer Sortierung ist es doch irgendwie "gleichartige" Einträge nah beinander zu halten.
Ob ich jetzt alle Dateien mit Attribut Bit zuerst sehe, oder die mit dem Read Only Flag ist dafür gar nicht so wichtig.
Wenn ich weiss wie die Sortierung funktioniert, dann finde ich mich in der sortierten Liste auch zurecht.

Im übrigen finde ich eine alphabetische Sortierung (wie bereits bemerkt macht der Explorer das ja so) durchaus "intuitiv" :)

Thomas
MikeTheGuru
Junior Member
Junior Member
Posts: 69
Joined: 2003-05-12, 18:44 UTC

Post by *MikeTheGuru »

@Norton:
und beim Namen fällt mir sicher auch noch was ein....
Beim Namen fällt mir 'langer Name' und 'DOS 8.3' ein ;-)
MikeTheGuru
RegNr #48208
Norton
Junior Member
Junior Member
Posts: 84
Joined: 2003-09-03, 20:08 UTC

Post by *Norton »

MikeTheGuru wrote:@Norton:
und beim Namen fällt mir sicher auch noch was ein....
Beim Namen fällt mir 'langer Name' und 'DOS 8.3' ein ;-)
GENAU! ;) oder umwandeln in Kleinbuchstaben / Gross-Klein Ansicht behalten.... Das wäre perfekt! Wann wirds umgesetzt? ;)
Post Reply