Avatar billede hrc Mester
28. juni 2006 - 11:12 Der er 11 kommentarer og
2 løsninger

TListViews kolonneoverskrifter tegnes ikke

Jeg har en tabbed notebook hvori der er flere listviews (alle i report mode).

Når jeg skifter til tredje tab, så bliver listview'ens kolonneoverskrifter ikke tegnet. Der er bare et blankt gråt felt hvor de skulle have været.

Skifter jeg tilbage til forrige tab og frem igen, eller ændrer størrelsen på min form, så tegnes kolonneoverskrifterne prompte.

Det er ikke første gang jeg har oplevet dette, og har løst det ved at sende den WM_SIZE message (ListView1.Perform(WM_SIZE,0,0)), men det virker ikke her.

Har prøvet at sætte Application.ProcessMessages ind, ListView1.Repaint, Invalidate og Refresh - intet får tegnet de !"#"#¤" kolonneoverskrifter.

Er der mon nogen der har en løsning?
Avatar billede tolderlund Nybegynder
28. juni 2006 - 11:52 #1
Hjælper det hvis du kalder Refresh eller Invalidate på formen eller din ListView?
Avatar billede hrc Mester
28. juni 2006 - 12:10 #2
Tolderlund: Ikke umiddelbart. Har prøvet at smække dem på i den rækkefølge jeg kom på dem (med application.processmessages mellem hver enkelt). Der skete intet.

Har været inde i dfm-filen og sammenlignet med de andre listviews: de var ens mht. properties og opbygning. Alle har de én kolonne der er "AutoSize".

Med snakken om dfm-filer er det klart at jeg i dette projekt bruger D7 - det glemte jeg at nævne.
Avatar billede tolderlund Nybegynder
28. juni 2006 - 13:19 #3
Et vildt gæt: Hvad sker der hvis du i FormCreate skriver følgende:
  ListView1.HandleNeeded;
Avatar billede hrc Mester
28. juni 2006 - 15:27 #4
Tolderlund: Det havde jeg ikke overvejet; desværre virker det ikke.

Jeg kan arbejde med dialogen, dvs. afkrydse linier, slette og tilføje, men først når jeg ændrer formens størrelse bliver headerene tegnet.
Har nu tilføjet yderligere 3 listviews som alle tegnes fint. Eneste forskel fra disse er, at der linjerne ikke er checkbox'ed. Har i øvrigt prøvet at slå det fra, men resultatet er uændret.
Avatar billede hrc Mester
28. juni 2006 - 22:15 #5
Hvis jeg undlader at bruge BeginUpdate/EndUpdate når jeg fylder ting i listen, så virker det fint. Det gør ingen forskel om jeg fylder i listen i formens OnCreate (som de andre bliver det), om den er i OnShow.

Den pågældende opgave løses ved at kommentere BeginUpdate og EndUpdate ud, men det undrer mig såre hvad der sker.
Avatar billede tolderlund Nybegynder
29. juni 2006 - 09:03 #6
Hvor kalder du BeginUpdate og EndUpdate?
Avatar billede hrc Mester
29. juni 2006 - 15:16 #7
Jeg har en SQL-query der fylder listen. Opbygningen er altid:

var
  ListItem : TListItem;
begin
  Query := TwwQuery.Create(nil);
  try
    ....
    Query.Open;

    lvData.Items.BeginUpdate;
    try
      lvDate.Items.Clear;
      while not Query.Eof do
      begin
        ListItem := lvData.Items.Add;
        TData.Create(
          Query.FieldByName('id').AsInteger,
          Query.FieldByName('navn').AsString).FillListItem(ListItem); // Lidt hacket
        Query.Next;
      end;
    finally
      lvData.Items.EndUpdate;
    end;
  finally
    Query.Free;
  end;
end;

Min FillListItem er opbygget således:

procedure TData.FillListItem(aListItem : TListItem);
begin
  aListItem.SubItems.Clear;
  aListItem.Caption := fNavn;
  aListItem.Data := self;
end;

Måske skal jeg prøve at rykke "aListItem.Data := self" op først. Når man tildeler Caption en værdi, så trigges der en OnChange-event der dog burde være inaktiv så længe BeginUpdate er aktiv; men opbygningen er altså den samme i de andre listviews.
Avatar billede kroning Nybegynder
29. juni 2006 - 15:36 #8
Har du prøvet med en Application.ProcessMessages som det første, dvs. lige inden linien " Query := TwwQuery.Create(nil);"
Jeg har selv haft nøjagtig samme problem men kan ikke lige huske hvordan jeg rettede det, den kode jeg brugte til at fixe problemet har jeg ikke længere da det ikke længere var et problem efter jeg skiftede fra paradox database til en MySQL database, hvorfor det så ikke længere var et problem fik jeg aldrig undersøgt da jeg havde travlt med at konvertere.
Langt væk syntes jeg lige pludselig at kan mindes det har noget at gøre med at der bliver sendt en message til ListVievet om at opdatere men denne besked når aldrig frem pga. den tid det tager databasen at blive færdig med forespørgelsen, men måske er jeg helt på vildspor.
Avatar billede hrc Mester
30. juni 2006 - 09:12 #9
kroning: Nu har jeg plastret til med ProcessMessages og det ser ud til at virke. Efter at have fjernet dem igen en efter en, er det kommandoen lige før EndUpdate der gør den store forskel. Så det har jeg gjort overalt i mit program.

Lukker derfor spørgsmålet.
Kroning: Et svar tak. Du inkasserer de 30.
Tolderlund: Jeg vil godt give 15 for indsatsen - så du må også gerne smide et svar.
(Ja, jeg hæver pointantallet med 15 - jeg er i sommerferiehumør)

I øvrigt så mener jeg det var Borrisholt (eller var det Arne?) der anbefalede brugen af upx-pakkeren. Jeg er meget imponeret over det og vil lige reklamere for det. Mit program fylder 15+Mb men pakket er den 3,5Mb. Kan også pakke dll-filer uden programmerne opdager det.
Avatar billede tolderlund Nybegynder
30. juni 2006 - 11:03 #10
tak for det.
Avatar billede kroning Nybegynder
01. juli 2006 - 07:36 #11
k
Avatar billede hrc Mester
02. juli 2006 - 17:21 #12
Kroning: Sikke noget fusk! Jeg ville gerne give tolderlund lidt for hans hjælp, men det blev på din bekostning. Kunne ikke finde ud af at hæve pointantallet og tænkte, at det var nok ved den individuelle fordeling af points det blev gjort. Næ nej. Dine points blev halveret. Jeg opretter lige et dummy-spørgsmål til dig.
Avatar billede kroning Nybegynder
02. juli 2006 - 17:24 #13
Nej, det behøver du ikke, de points er ikke så vigtige.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester