DrawText geht in einer Unit nicht???



  • Hallo, stehe vor einem Rätsel. Ich zeichne eine ListView selbst; dies funktioniert in Units eines anderen Projekts einwandfrei; kopiere ich nun die Funktion rüber kommt immer bei DrawText (kommt in der Funktion zweimal vor) die Meldung:

    [C++ Warnung] LokalePC.cpp(931): W8006 const Windows__1 wird mit ComCtrls__9 initialisiert
    Vollständiger Parser-Kontext
    LokalePC.cpp(914): Analyse von: void _fastcall TForm18::frm18_lvTabelleDrawItem(TCustomListView *,TListItem *,TRect &,TOwnerDrawState)
    [C++ Fehler] LokalePC.cpp(942): E2034 Konvertierung von 'char *' nach 'const wchar_t *' nicht möglich
    Vollständiger Parser-Kontext
    LokalePC.cpp(914): Analyse von: void _fastcall TForm18::frm18_lvTabelleDrawItem(TCustomListView *,TListItem *,TRect &,TOwnerDrawState)
    [C++ Fehler] LokalePC.cpp(942): E2342 Keine Übereinstimmung des Typs beim Parameter 'lpString' ('const wchar_t *' erwartet, 'char *' erhalten)
    Vollständiger Parser-Kontext
    LokalePC.cpp(914): Analyse von: void _fastcall TForm18::frm18_lvTabelleDrawItem(TCustomListView *,TListItem *,TRect &,TOwnerDrawState)

    Funktion (ListView ist frm18_lvTabelle):

    void __fastcall TForm18::frm18_lvTabelleDrawItem(TCustomListView *Sender, TListItem *Item, TRect &ARect, TOwnerDrawState State)
    {try {                                                                          // Fehlerroutine Start
     Integer iSymb,iAnz,iB,iStil,iItem; AnsiString z1,z2;                           // Vars definieren
     TColor f1,f2; TCanvas *ACanvas;                                                // Vars definieren
     TListView   *LView= dynamic_cast<TListView   *>     (Sender);                  // Versuchen, Sender als TListView anzusprechen
     TRect CRect;                                                                   // Rect Strukt vorbereiten
     Graphics::TBitmap *bmp;                                                        // Bitmap vorbereiten
    
     z1     =" "+Item->Caption;                                                     // aktuelle Spalte
     iAnz   =Item->SubItems->Count;                                                 // Anzahl Subs
     iItem  =Item->Index;                                                           // Index ermitteln
     ACanvas=LView->Canvas;                                                         // Canvas übergeben
     f1     =clWhite;                                                               // Voreinstellung HG in ws
     f2     =clGray;                                                                // Textfarbe
     iStil  =DT_LEFT;                                                               // Ausrichtung
    
    // if(oZugZeil==true && Odd(iItem)==true) { f1=0x00EEEEEE; }                      // HG, alle 2 Zeilen hellgrau
     if(Odd(iItem)==true) { f1=0x00EEEEEE; }                                        // HG, alle 2 Zeilen hellgrau
     if(State.Contains(cdsSelected)==true)  { f1=clSkyBlue; f2=clNavy; }            // Eintrag ist selektiert
    
     CRect=ARect;                                                                   // Koords neu übergeben
     CRect.Right=LView->Columns->Items[0]->Width-1;                                 // Breite 1. Spalte
     ACanvas->Brush->Color=f1;                                                      // Farbe HG festlegen
     ACanvas->Font->Color =f2;                                                      // Farbe VG festlegen
     ACanvas->FillRect(CRect);                                                      // HG befüllen
    
     CRect      =ARect;                                                             // Koords neu übergeben
     CRect.Left+=20;                                                                // Text wegen Symbole mehr rechts
     ACanvas->Font->Name="Arial"; ACanvas->Font->Size=8;                            // Schriftart
     DrawText(ACanvas->Handle,"test",-1,&CRect,iStil | DT_VCENTER | DT_SINGLELINE); // und beschriften
    
     iSymb=Item->ImageIndex;                                                        // aktuelles Symbol vorne?
     CRect.Left-=20;                                                                // Koordinate wieder abziehen
     bmp  =new Graphics::TBitmap();                                                 // neue Bitmap anlegen
     Form1->frm1_ImageList1->GetBitmap(iSymb,bmp);                                  // und aus ImageListe holen
     ACanvas->Draw(CRect.Left,CRect.Top,bmp);                                       // Checkbox zeichnen
     delete bmp;                                                                    // Bitmap löschen
    
                                                                                    // SUBITEMS ZEICHNEN
     CRect=ARect;                                                                   // Koords neu übergeben
     for(int i1=0;i1<iAnz;i1++) {                                                   // die Subs zeichnen
      z1=" "+Item->SubItems->Strings[i1];                                           // Spaltentext auslesen
      iB=LView->Columns->Items[i1]->Width;                                          // Breite der Spalte X
      //f1=clWhite; if(oZugZeil==true && Odd(iItem)==true) { f1=0x00EEEEEE; }         // HG, alle 2 Zeilen hellgrau
      f1=clWhite; if(Odd(iItem)==true) { f1=0x00EEEEEE; }                           // HG, alle 2 Zeilen hellgrau
      f2=clBlack;                                                                   // Textfarbe
      CRect.Left +=iB;                                                              // X1-Koord neu
      CRect.Right =CRect.Left+LView->Column[i1+1]->Width-1;                         // X2-Koord neu
      iStil       =DT_LEFT;                                                         // Ausrichtung
    
      switch(i1) {                                                                  // welche Spalte?
      case 0:                                                                       // 01 GERÄTENAME
       f2=clBlue;                                                                   // Standard
       if(z1.AnsiPos("unbekannt")>0) { f2=clRed; }                                  // Gerät unbekannt
       break;                                                                       // und fertig
      case 1:                                                                       // 02 GERÄTETYP
       f2=clBlue;                                                                   // Standard
       break;                                                                       // und fertig
      default: break;                                                               // WEITERE SPALTEN STANDARD
      }                                                                             // ende switch(i1
    
      if(State.Contains(cdsSelected)==true)  { f1=clSkyBlue; f2=clNavy; }           // Eintrag ist selektiert
    
      ACanvas->Brush->Color=f1;                                                     // Farbe HG festlegen
      ACanvas->Font->Color =f2;                                                     // Farbe VG festlegen
      ACanvas->FillRect(CRect);                                                     // HG befüllen
      DrawText(ACanvas->Handle,z1.c_str(),-1,&CRect,iStil | DT_VCENTER | DT_SINGLELINE);  // und beschriften
     }                                                                              // ende for(i1
    
     } catch(Exception& e) { MessageBox(NULL, e.Message.c_str(), "TForm18::frm18_lvTabelleDrawItem()", MB_OK); }  // Fehler anzeigen
    }
    

    Zeile 30 und Zeile 67 meckert er; wenn ich die wegmache, dann meckert er nicht mehr, zeichnet aber (logischerweise) auch nicht mehr 🤡 Die Eigenschaft OwnerDraw sitzt auf True.

    Was will der Bub äh BCB von mir? Grübel...

    Danke für jeden Tipp.
    Gruss Stefan



  • Schau dir mal die Fehlermeldungen genau an. Du scheinst in diesem Projekt Unicode aktiviert zu haben, d.h. du mußt alle Parameter als wchar_t anstatt char übergeben:

    DrawText(..., L"test", ...);
    
    WideString ws = L"blabla";
    DrawText(..., ws.c_str(), ...);
    

    P.S. Anstatt der meisten unsinnigen Kommentare solltest du besser deine Variablen aussagekräftigere Namen geben



  • Hallo Th

    Vielen Dank für Deine Antwort. Am Anfang stand tatsächlich define UNICODE. 😕 War mir bis Dato unbekannt.

    Was meine "unsinnigen" Variabeln betrifft, jeder hat seinen Stil 😉

    Grüsse, Stefan



  • Bzgl. des Stils solltest du daran denken, daß es schwer ist, solchen Code zu lesen und zu verstehen (trotz der Kommentare).
    Aber hast ja Glück gehabt, daß ich dir helfen konnte -)


Anmelden zum Antworten