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

Delphi - ερώτηση για TStringGrid


Μέλας Κύων

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

Δημοσ.

καλησπέρα. Είμαι αρχαριος σε Delphi και κανω παιδαριώδη ερώτηση..

Εχω StringGrid σε φόρμα και ψάχνω ώρες τώρα για ιδιότητα που να στοιχίζει δεξια ή στο κέντρο τις επικεφαλίδες-τιτλους των πεδίων του πλέγματος. Δηλ από :

 

--------------------------------------------------------

Επώνυμο |Ονομα |Τηλέφωνο | κ.λ.π. κ.λ.π. ...

--------------------------------------------------------

| | |

 

σε :

 

--------------------------------------------------------

Επώνυμο | Ονομα | Τηλέφωνο | κ.λ.π. κ.λ.π. ...

--------------------------------------------------------

| | |

 

 

 

΄''???

Δημοσ.

Καταρχήν, δεν προγραμματίζω σε Delphi αλλά σε C/C++ Builder ο οποίος όμως μοιράζεται την βιβλιοθήκη (VCL) της πρώτης και ουσιαστικά αποτελεί την εκδοχή της Delphi για την C/C++.

 

Λοιπόν, η συγκεκριμένη λειτουργία τουλάχιστον στην έκδοση 6 και 2006 του εργαλείου μου δεν παρέχεται οπότε το μόνο που μπορώ να κάνω είναι να ορίσω ένα δικό μου event για τον σχεδιασμό των περιεχομένων του TStringGrid (OnDrawCell) και η χρησιμοποιησή της Windows API ρουτίνας DrawText η οποία αναλαμβάνει αυτόματα το οριζόντιο ή/και κάθετο κεντράρισμα (ή στοίχιση δεξιά, αριστερά κτλ) κειμένου με βάση τις διαστάσεις του χώρου μας (διαστάσεις Cell).

 

Αν λοιπόν δεν μπορείς να βρεις κάποιο property που να καθορίζει το alignment του κειμένου για τα Cells του TStringGrid componenτ, ή κάποιο component 3ου κατασκευαστή, τότε η χρήση του OnDrawCell event μάλλον είναι μονόδρομος.

 

Περισσότερες λεπτομέρειες δυστυχώς δεν μπορώ να παραθέσω καθώς δεν γνωρίζω Delphi/PASCAL -αν θες απλά να δημοσιεύσω τον κώδικα (είναι πολύ εύκολος) σε C/C++ Builder 6 και να το κάνεις μόνος σου port σε Delphi, πες μου.

Δημοσ.

Ο παρακάτω κώδικας τοποθετείται στο OnDrawCell event του TStringGrid component μας (υποθέτουμε πως το έχουμε ονομάσει StringGrid1), με σκοπώ να σχεδιάσει το κείμενο κάθε fixed cell κεντραρισμένο στις διαστάσεις του cell.

 

>
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
     int ARow, TRect &Rect, TGridDrawState State)
{
  TStringGrid    *ourStringGrid = (TStringGrid*)Sender;

  if(State.Contains(gdFixed))
   {
     ourStringGrid->Canvas->FillRect(Rect);
     DrawText(ourStringGrid->Canvas->Handle,ourStringGrid->Cells[ACol][ARow].c_str(),
              ourStringGrid->Cells[ACol][ARow].Length(),&Rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

   }
}

 

Καταρχήν, πριν ξεκινήσουμε ελέγχουμε εάν το property DefaultDraw του TStringGrid component μας είναι true, αν όχι το ορίζουμε ως τέτοιο. Με αυτό τον τρόπο εξηγούμε στο TStringGrid πως θέλουμε να σχεδιάζει αυτόματα τον εαυτού ώστε να μην χρειασθεί ύστερα στην OnDrawCell να σχεδιάσουμε μόνοι μας ολόκληρο το TStringGrid component!

 

Μετά κάνουμε cast το TObject* Sender που μας παρέχει το OnDrawCell event σε TStringGrid* (ourStringGrid) έτσι ώστε να μην «δεσμεύουμε» τον κώδικα μας με μια συγκεκριμένη ονομασία του TStringGrid component.

 

Ύστερα με την βοήθεια του State, ελέγχουμε (Contains) εάν το Cell που πρόκειται να σχεδιάσουμε είναι fixed (gdFixed).

 

Εάν είναι τότε, σβήνουμε σχεδιάζοντας ένα γεμάτο με το ανάλογο χρώμα παραλληλόγραμμο (FillRect) το κείμενο που έχει ήδη τοποθετήσει το TStringGrid μας στο fixed Cell και ύστερα με την βοήθεια της Windows API ρουτίνας DrawText σχεδιάζουμε στο TStringGrid DC (->Canvas->Handle) το κείμενο του Cell μας (->Cells[ACol][ARow]) με μέγεθος χαρακτήρων (->Cells[ACol][ARow].Length()) στην ανάλογη θέση (&Rect) κεντραρισμένο οριζόντια (DT_CENTER) και εφʼ όσον απαρτίζεται από μια μόνο γραμμή κάθετα (DT_VCENTER|DT_SINGLELINE).

 

Καλή τύχη :)

Δημοσ.

Oρίστε και ένα παράδειγμα σε Delphi. Όπως είπε και ο Directx θα πρέπει να έχεις DefaultDrawing = true.

 

Στο παρακάτω παράδειγμα, το κελί στην θέση (1, 1) ζωγραφίζεται bold άσπρο σε κόκκινο background και βέβαια στoιχίζεται δεξιά.

 

>procedure TForm1.myGridDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 s: string;
begin
 with TStringGrid(Sender).Canvas do begin
   if not (gdFixed in State) then begin
     if (ARow = 1) and (ACol = 1) then begin
       Font.Style := [fsBold];
       Font.Color := clWhite;
       Brush.Color := clRed;
       FillRect(Rect);
       s := TStringGrid(Sender).Cells[ACol, ARow];
       TextOut(Rect.Right - TextWidth(s) - 4, Rect.Top + 2, s);
     end;
   end;
 end;
end;

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

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

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