Avatar billede nikkelai Nybegynder
04. januar 2004 - 21:30 Der er 10 kommentarer

ListView Items fra Edit

Jeg er igang med at lave et program og skal have lagt teksten fra et edit felt ind som item i en listview men det gir mig lidt problemer skal man skrive Tlistview.items.add... eller hva skal man skrive?
Avatar billede nca Juniormester
04. januar 2004 - 21:36 #1
Du skal skrive
ListItem := Items.Add;
      ListItem.Caption := 'Hovednøgle';
      ListItem.SubItems.Add('Undernøgle');
Avatar billede nikkelai Nybegynder
04. januar 2004 - 21:47 #2
Det virker sådan da men jeg har 5 koloner og 5 edit der kommer noget i den første og resten ender i den næste. Jeg ville gerne have det sådan at der var en edit til hver kolonne
Avatar billede nca Juniormester
04. januar 2004 - 21:53 #3
Prøv om du kan bruge index til at bestemme linienummer og subitem til hver kolonne:

  ListView1.Items.Add;
  ListView1.Items[0].Caption := 'Efternavne';
  ListView1.Items[0].SubItems.Add('Hansen');
  ListView1.Items[0].SubItems.Add('Petersen');
Avatar billede nikkelai Nybegynder
04. januar 2004 - 22:24 #4
Det virkede bedre nu havner alle subitems i den øverste linje jeg kan ikke rigtigt få det til. Har du en ide
Avatar billede doc404 Novice
05. januar 2004 - 02:18 #5
du mangler lidt fra nca's første svar...

procedure TForm1.Button1Click(Sender: TObject);
var
  Item : TListItem;
begin
  Item := ListView1.Items.Add;
  Item.Caption := Edit1.Text;
  Item.SubItems.Add(Edit2.Text);
  Item.SubItems.Add(Edit3.Text);
  Item.SubItems.Add(Edit4.Text);
  ...
end;
Avatar billede nca Juniormester
05. januar 2004 - 08:17 #6
Her er et eksempel på hvor du bruger 2 linjer:

  ListView1.Items.Add;
  ListView1.Items[0].Caption := 'Efternavne';
  ListView1.Items[0].SubItems.Add('Hansen');
  ListView1.Items[0].SubItems.Add('Petersen');
  ListView1.Items.Add;
  ListView1.Items[1].Caption := 'Fornavne';
  ListView1.Items[1].SubItems.Add('Hans');
  ListView1.Items[1].SubItems.Add('Peter');
Avatar billede hrc Mester
05. januar 2004 - 08:30 #7
Der er noget grundlæggende forkert ved nca's eksempler. Det er, at han refererer til items[x] efter at have added et TListItem. Dette virker kun hvis listen ikke sorteres automatisk og er - undskyld - lidt noget fusk.

doc404's eksempel er derfor meget pænere. Man kan evt. optimere lidt på den således (hvilket er min egen upopulære favorit):

with ListView1.Items.Add do begin
  Caption := Edit1.Text;
  SubItems.Add(Edit2.Text);
  osv.
end;

Bemærk i øvrigt, at en TListItem har en .data pointer som man kan hægte objekter - noget der er meget praktisk når man arbejder med objekter.
Avatar billede hrc Mester
06. januar 2004 - 10:54 #8
Hvordan kan du blive ved med at afvise de svar der er kommet, når spørgsmålet ser ud til at være blevet besvaret flere gange?

Hvis spørgsmålet er opfattet forkert, så må du omformulere - ellers må du hoste op med de points du har allokeret.
Avatar billede nikkelai Nybegynder
06. januar 2004 - 15:48 #9
Er det ikke kun ved svar at jeg kan give point jeg ville gerne give point men det skulle helst være til den der svarede på mit spørgsmål hvilket jeg vil sige var doc404 hvis jeg kan give point for en kommentar så fortæl mig lige hvordan
Avatar billede hrc Mester
07. januar 2004 - 08:40 #10
OK, beklager. Havde ikke set at doc404 kun havde kommenteret det. Du må bede doc404 om at smide et svar.

Vil igen lige reklamere lidt for .data propertyen - tror det er en overset ting - og så vil jeg gerne undskylde.

Givet er:
TPerson = class
private 
  fNavn : string;
  fAdresse : string;
  fPostNr : string;
  ..
public
  constructor Create(const aNavn, aAdresse, aPostNr ...);
  procedure FillListItem(aListItem : TListItem);
  property Navn : string read fNavn;
  property Adresse : string read fAdresse;
  property PostNr : string read fPostNr;
end;

TPerson.FillListItem(aListItem : TListItem);
begin
  with aListItem do begin
    SubItems.Clear; // Clear the subitems that might be
    Data := self; // Set's a reference to the TPerson obj.

    Caption := fNavn; // Thich triggers OnSelect so data must be set
      // before in order to be able to access the object there
  end; // with
end;

Det smarte er, at kun navnet vises, men i din OnSelect har du adgang til hele TPerson objektet som refereres via .data:

procedure  Form1.ListView1OnSelect(.. Item:TListItem);
var
  Person : TPerson;
begin
  if not (assigned(Item) and Item.Seleced and Item.Focused) then
    exit;

  Person := Item.Data; // Data is a pointer - no need to typecast

  lAdresse.Caption := Person.Adr; // etc.
end;

Objektorienteret set er det hensigtsmæssigt at lade objektet formattere TListItem'et (via FillListItem) idet det kender data. Jeg har snydt lidt idet at jeg ikke sætter TListView'ets columns op - så data er desværre ikke helt indkapslet - men jeg håber du fanger ideen (hvis man vil, så kan man også få adgang til TListView'et via det TListItem man sender det).
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