Προς το περιεχόμενο

Listview στη C++


georginos1989

Προτεινόμενες αναρτήσεις

  • Απαντ. 62
  • Δημ.
  • Τελ. απάντηση

Λοιπόν έτσι όπως είναι τωρα το listview που εχει χρώμα μονο στη μια στηλη πχ κοκκινο... μπορώ αντι να ειναι κοκκινο όλη η στηλη να παιρνει και αλλα χρώματα? Δοκιμασα με το SubItemColor[] εβαζα μεσα στην παρενθεση το νουμερο του κάθε subitem για αυτη τη στήλη αλλά δεν γίνετε...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν έτσι όπως είναι τωρα το listview που εχει χρώμα μονο στη μια στηλη πχ κοκκινο... μπορώ αντι να ειναι κοκκινο όλη η στηλη να παιρνει και αλλα χρώματα? Δοκιμασα με το SubItemColor[] εβαζα μεσα στην παρενθεση το νουμερο του κάθε subitem για αυτη τη στήλη αλλά δεν γίνετε...

Δεν είμαι σίγουρος τι θες να κάνεις...

 

Αν θες κάτι τέτοιο:

 

moded.png

 

Φυσικά θα πρέπει μόνος σου πια να καθορίζεις με βάση κάποια κριτήρια τι χρώμα θες σε κάθε TListItem SubItem που σχεδιάζεις. Τι κριτήρια είναι αυτά, το καθορίζεις μόνος σου.

 

Για παράδειγμα εγώ ζητώ από το πρόγραμμα να βάφει κάθε πρώτο SubItem εκείνου του TListItem που το Index του (δλδ. η θέση του στο TListView) πληρεί την προϋπόθεση % 2, είτε με κόκκινο είτε με μπλε χρώμα.

 

>
if(Stage == cdPrePaint)
if(SubItem == 1)
	ListView1->Canvas->Brush->Color = Item->Index % 2 ? clRed: clBlue;
else
           	ListView1->Canvas->Brush->Color = clWhite;

Τώρα εσύ με βάση τα δικά σου κριτήρια ορίζεις το χρώμα του Brush σε ότι σε εξυπηρετεί είτε βασιζόμενος σε κάποια δεδομένα του TListItem σου ή με βάση ότι άλλο επιθυμείς (την τεχνική πλέον την γνωρίζεις - θα πρέπει απλά να την εφαρμόσεις κατά το δοκούν).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι οκ κατι καταλαβα...

Θα το προσπαθησω...

Για να καταλάβεις τι θελω

Ανάλογα με το τι θα εχει μεσα το καθε subitem σε μια στηλη να το βαφει με διαφορετικο χρωμα... Αρα θα εχω μια συνθηκη πχ αν ειναι 1 βαψε μπλε αν ειναι 2 βαψε κοκκινο....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι οκ κατι καταλαβα...

Θα το προσπαθησω...

Για να καταλάβεις τι θελω

Ανάλογα με το τι θα εχει μεσα το καθε subitem σε μια στηλη να το βαφει με διαφορετικο χρωμα... Αρα θα εχω μια συνθηκη πχ αν ειναι 1 βαψε μπλε αν ειναι 2 βαψε κοκκινο....

 

Ναι, για παράδειγμα:

modee.png

 

Αν το κείμενο του SubItems είναι:

  • "1" τότε Κόκκινο
  • "2" τότε Πράσινο
  • "3" τότε Μπλε

Ακολουθεί ένα υπόδειγμα, γραμμένο όσο πιο ξεκάθαρα γίνεται:

>
if(Stage == cdPrePaint)
	if(SubItem == 1)
	{
		if(Item->SubItems->Strings[subItem - 1] == "1")
			ListView1->Canvas->Brush->Color = clRed;
		if(Item->SubItems->Strings[subItem - 1] == "2")
			ListView1->Canvas->Brush->Color = clGreen;
		if(Item->SubItems->Strings[subItem - 1] == "3")
			ListView1->Canvas->Brush->Color = clBlue;
	}
	else
           	        ListView1->Canvas->Brush->Color = clWhite;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν για να μην ανοίγω νέο θέμα...

Έχω ενα πίνακα σε μια βαση σε sql server και θέλω απο τον πινακα να παίρνω εγγραφές με sql ερώτημα τον οποίο θα τρέχει στην c και να γεμίζω το listview... Για αρχη το ερωτημα βρισκεται σε ενα κουμπι και οταν το πατας τρεχει και γεμιζει το Listview μια μια εγγραφη καθε φορα.. Ομως καθε φορα παιρνει την ιδια εγγραφη... Πως θα το κανω να πηγαίνει καθε φορα στην επομενη εγγραφη?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο κωδικας που εβαλα στο κουμπι

 

ADOQuery1->SQL->Text=" select CODE as DC, NAME as N, NAME2 as N2 \

from DOCTOR where CODE=1+counter ";

 

ADOQuery1->ExecSQL();

 

ADOQuery1->Active=true;

 

a=ADOQuery1->FieldValues["DC"];

b=ADOQuery1->FieldValues["N"];

 

d=ADOQuery1->FieldValues["N2"];

 

 

lst=ListView1->Items->Add();

lst->Caption=a;

li=ListView1->Items->Item[0];

lst->SubItems->Add(B);

li=ListView1->Items->Item[1];

lst->SubItems->Add(d);

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και κάτι άλλο για το event που βάζει χρώμα στα subitems... Γιατί χρειάζεται η πρώτη if?

H if(Stage == cdPrePaint) ?

To έτρεξα και χωρίς αυτην και δουλευε...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτη η ρουτινα που βρισκετε?

Είναι ρουτίνα που σου προσφέρει το ADOQuery1 component.

 

 

Και κάτι άλλο για το event που βάζει χρώμα στα subitems... Γιατί χρειάζεται η πρώτη if?H if(Stage == cdPrePaint) ?To έτρεξα και χωρίς αυτην και δουλευε...

Όπως σου υπέδειξα εδώ το OnAdvancedCustomDrawSubItem event καλείται σε διάφορες φάσεις (Stage) σχεδίασης του TListView οπότε με το cdPrePaint εξασφαλίζω ότι το χρώμα του TListView->Canvas->Brush θα αλλάξει μόνο πριν την έναρξη της σχεδίασης και όχι μετά από αυτήν κλπ. Οπότε είναι μια ελάχιστη εξασφάλιση (play it safe) για το πότε θα αλλάξουμε το Brush TColor του TCanvas μας και την χρησιμοποιώ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Από ότι βλέπω υπάρχει μια ακόμη ρουτίνα στο TADOQuery που ονομάζεται "Next" δοκίμασε την και αυτήν.

 

Επίσης έχε υπόψη σου ότι την FindNext μπορείς να την καλείς σε ένα loop μέχρι να επιστρέψει false διαβάζοντας ένα - ένα όλα τα αποτελέσματα του TADOQuery.

 

Τώρα αν δεν δουλέψει τίποτε από αυτά, και καθώς δεν ασχολούμαι με τις ΒΔ functions του C++ Builder δεν έχω κάτι άλλο να σου προτείνω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...