31. januar 2004 - 19:00Der 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);
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:
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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;
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.
Har selv løst problemmerne, men hrc du får halvdelen da det var ud fra din kode at jeg fandt en løsning.
Synes godt om
Ny brugerNybegynder
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.