Avatar billede fun22 Nybegynder
31. januar 2004 - 19:00 Der er 4 kommentarer og
2 løsninger

2 problemer med treeview

Hej
jeg har lige 2 problemer med treeview som jeg håber i kan hjælpe med.

1. Jeg bruger følgende kode til at hente ting fra en ini file, og sætte dem in i treewiew'en:

var
  IniFile: TInifile;
  I: Integer;
  S: TStringList;
begin
if opendialog1.Execute then
if opendialog1.filename > '' then begin
IniFile := TInifile.create(opendialog1.filename);

TreeView1.Items.Clear;
TreeView1.Items.Add(nil, IniFile.readString('Project','Title',''));

S := TStringList.Create;
st := TStringList.Create;
inifile.ReadSection('Files', S);
IniFile.ReadSectionValues('Files', st);
for I := 0 to S.Count-1 do begin
  TreeView1.Items.AddChild(treeview1.Items.GetFirstNode, st.names[i]);
s.Free;
inifile.free;

Men når der er mere end en ting under FILES kommer den med en access violation. Hvorfor?

2. Hvordan laver man den samme funktion i treeview som man kan i listview med denne kode:

[FlatListBox1.Items[FlatListBox1.ItemIndex]]

??
Avatar billede hrc Mester
31. januar 2004 - 20:49 #1
Prøv at se koden her:

procedure TfrmMain.btnLoadClick(Sender: TObject);
var
  i : integer;
  ini : TIniFile;
  Sections : TStringList;
begin
  if odOpenInifile.Execute then begin
    fFileName := odOpenInifile.FileName;
    if FileExists(fFileName) then begin
      tvInifil.Items.BeginUpdate;
      Sections := TStringList.Create;
      ini := TIniFile.Create(fFileName);
      try
        tvInifil.Items.Clear;
        ini.ReadSections(Sections);
        for i := 0 to Sections.Count - 1 do
          tvInifil.Items.Add(nil,Sections[i]);
      finally
        ini.Free;
        Sections.Free;
        tvInifil.Items.EndUpdate;
      end; // try
    end; // if
  end; // if
end;

procedure TfrmMain.tvInifilClick(Sender: TObject);
var
  i : integer;
  ini : TIniFile;
  Entries : TStringList;
  Node : TTreeNode;
begin
  Node := (Sender as TTreeView).Selected;
  if not assigned(node) then
    exit;

  if (Node.Level = 0) and not Node.HasChildren then begin
    tvInifil.Items.BeginUpdate;
    Entries := TStringList.Create;
    ini := TIniFile.Create(fFileName);
    try
      ini.ReadSectionValues(Node.Text,Entries);
      for i := 0 to Entries.Count - 1 do
        tvInifil.Items.AddChild(Node,Entries[i]);
    finally
      ini.Free;
      Entries.Free;
      tvInifil.Items.EndUpdate;
    end; // try
  end; // if
end;

I testprogrammet jeg lavede er en knap der læser sektionerne ind og når man klikker på en af dem i TTreeView'et, så undersøges om der er "børn" - hvorefter disse indlæses. Du kunne selvfølgelig også læse ind på een gang (se nedenfor), men her har jeg valgt at læse dem i mindre klumper.

Med hensyn til at vælge en knude, så har treeview'et en Select som du kan fodre med den/de knude(r) som du vil have valgt. Du kan også bruge .selected-propertyen til at vælge: tvInifil.selected := tvInifil.Items[10] for at vælge denne knude. Bemærk, at hver knude har en .index som svarer til dennes plads i Items-listen.

Nedenstående procedure læser ind i eet hug:

procedure TfrmMain.btnLoadAllClick(Sender: TObject);
var
  i,j : integer;
  ini : TIniFile;
  Node : TTreeNode;
  Sections, Entries : TStringList;
begin
  if odOpenInifile.Execute then begin
    fFileName := odOpenInifile.FileName;
    if FileExists(fFileName) then begin
      tvInifil.Items.BeginUpdate;
      Sections := TStringList.Create;
      Entries := TStringList.Create;
      ini := TIniFile.Create(fFileName);
      try
        tvInifil.Items.Clear;
        ini.ReadSections(Sections);
        for i := 0 to Sections.Count - 1 do begin
          Node := tvInifil.Items.Add(nil,Sections[i]);
          ini.ReadSectionValues(Node.Text,Entries);
          for j := 0 to Entries.Count - 1 do
            tvInifil.Items.AddChild(Node,Entries[j]);
        end; // for
      finally
        ini.Free;
        Entries.Free;
        Sections.Free;
        tvInifil.Items.EndUpdate;
      end; // try
    end; // if
  end; // if
end;
Avatar billede fun22 Nybegynder
31. januar 2004 - 21:03 #2
får en fejl ved fFileName...
Avatar billede stone Forsker
31. januar 2004 - 22:11 #3
{ Private declarations }
    FFileName: string;
Avatar billede hrc Mester
01. februar 2004 - 08:12 #4
I min programmeringsverden (dvs. primært sige Delphi ;-)) der har det været en defacto standard at private variable navngives med et 'f'. Jeg bruger lille 'f' da det er mig bedst læseligt (der afviger jeg fra standarden).

Tilsvarende bruger jeg 'a' ved parametre så jeg får noget ligennde:

constructor TMyClass.Create(const aNavn, aAdresse : string);
begin
  inherited Create;

  fNavn := aNavn;
  fAdresse := aAdresse;
end;

Ved ikke om det sidste er defacto standard, men det var hvad jeg lærte i sin tid.

Jeg bruger fFileName til at registrere navnet, så det kan hittes igen i TTreeView's OnClick event. Du kan skrive variablen ud hvis du kun bruger det sidste eksempel.

-------------------- oOo --------------------

Hvorfor vil du overhovedet læse inifiler? Det er mit indtryk at MS efterhånden har fået os (programmører) hjernevasket til at bruge registreringsdatasen. Inifiler skal nok være der i fremtiden, men kun for bagud kompatibilitet.
Avatar billede fun22 Nybegynder
01. februar 2004 - 10:28 #5
Har selv fået spm 1 til at funke... Jeg skulle bare sætte try på min egen kode.

Men jeg mangler stadigvæk spm 2... Kan i ikke hjælåe med det?
Avatar billede fun22 Nybegynder
01. februar 2004 - 12:07 #6
Har selv løst problemmerne, men hrc du får halvdelen da det var ud fra din kode at jeg fandt en løsning.
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