03. august 2002 - 13:43Der er
26 kommentarer og 2 løsninger
SelectDirectory med TEdit og TCheckBox + større projekter
Hej Eksperter
Jeg har to spørgsmål.
Første spørgsmål: Jeg har et program der skal søge i en mappe som man vælger med SelectDirectory-funktionen. Fra den dialog skal man samtidig gerne kunne vælge om den skal kunne søge i undermapper. Hvis der skal søges på netværk, og man har problemer med at finde netværs-mappen, så skal man samtidig kunne angive stien i en TEdit i stedet... Denne TEdit må også gerne ændre sin text-property efterhånden som kigger rundt i mapperne.
Jeg havde forestillet mig en funktion noget i retning af:
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string; out SubDirs: Boolean): Boolean; overload;
Andet spørgsmål: Jeg oplever tit at de programmer jeg laver bliver uoverskuelige og at jeg skal til at lave tingene om og opbygge funktioner og klasser på ny.
Er der nogen der kan gi' mig nogle gode links der omhandler udvikling af større projekter... Hvordan starter man, hvilken proces skal man i gennem og så videre...
ad 2) Delphi er et fedt udviklingsværktøj der er bare det kedelige at pga. at det er et skide godt RAD værktøj animere det til at man laver "spagetti kode", men hvis du lige tæller til ti inden du starter og husker at bruge en fornuftig navngivning af dine units/forms/comp så er du nået langt, og du skal også huske at det er dårligt design hvis du får behov for at lave cirkulære uses.
>>martinlind Det med komponent navngivning har jeg efterhånden godt styr på, og det nyder jeg MEGET!!! Det kan også være det mere er information om OOP jeg søger, men er lidt i tvivl... :/
>>martinlind Det er f.eks. hvis du sidder på et netværk med mange personer og ikke kan finde den person i en arbejdsgruppe... Det er også ofte at jeg finde arbejdsbruppe-søgning langsom, så hvis man bare kunne angive adressen i en TEdit i stedet ville det være en klar fordel!
Det leder lidt ind på et andet spørgsmål fra min side... Hvis jeg f.eks. har en property i en klasse og den bliver ændret, hvordan sender den klasse besked til en anden klasse der bruger den om at den har ændret sig?
F.eks. en TListBox har en property'en Items som er TStrings. Hvis man skriver ListBox.Items.Add('hest'); hvordan får ListBox'en så besked om at der er ændret i Items?
Hvis du kigger på TStrings, som er den næsten alle Items arver fra vil du opdage at den har en Event der hedder OnChange så hut jeg visker det er den hurtigste måde, du skal bare være opmærksom på at du ikke prøver at fyre et event af til en classe du har free'et, med andre ord du skal ha lidt housekeeping, mht. OOP prøv at søg på borland side efter turbopascal 5.5 den kan du hente gratis, der var i sin tid en OOP bog med, fordi det var første udgave hvor OOP blev impl. det trykte udgave kom med en DANSK version af den.
Du skal nok lave noget selv, med dit eget TTreeView, det ville jeg gøre, du kan finde noget om hvordan du finder "my network places" på Jens B. hjemme side.
Det har jeg! Hans WNetOpenEnum fungerer fantastisk... Jeg ser dog lidt et problem hvis det er en anden Windows-version, så kan brugeren måske se lidt underligt på en dialog der ser anderledes ud end normalt...
I Winamp er det lavet... Hvis man vælge Add->Add dir, så er der noget af det jeg leder efter!
Kunne man ikke eventuelt finde handle'et på vinduet og så smide de to komponenter på?
Koden ser således ud (kopieret direkte ud af FileCtrl.pas og med lidt kommentering):
uses ShlObj, ActiveX, Windows, Forms;
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; var WindowList: Pointer; BrowseInfo: TBrowseInfo; Buffer: PChar; RootItemIDList, ItemIDList: PItemIDList; ShellMalloc: IMalloc; IDesktopFolder: IShellFolder; Eaten, Flags: LongWord; begin Result := False; Directory := ''; FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then begin Buffer := ShellMalloc.Alloc(MAX_PATH); try RootItemIDList := nil; if Root <> '' then begin SHGetDesktopFolder(IDesktopFolder); IDesktopFolder.ParseDisplayName(Application.Handle, nil, POleStr(Root), Eaten, RootItemIDList, Flags); end; with BrowseInfo do begin hwndOwner := Application.Handle; pidlRoot := RootItemIDList; pszDisplayName := Buffer; lpszTitle := PChar(Caption); ulFlags := BIF_RETURNONLYFSDIRS; //Hvis man smider et "+ BIF_EDITBOX", så kommer den TEdit jeg savner, men hvad så med CheckBoxen? end; WindowList := DisableTaskWindows(0); try ItemIDList := ShBrowseForFolder(BrowseInfo); //Her kommer vinduet frem og afventer indput fra brugeren finally EnableTaskWindows(WindowList); end; Result := ItemIDList <> nil; if Result then begin ShGetPathFromIDList(ItemIDList, Buffer); ShellMalloc.Free(ItemIDList); Directory := Buffer; end; finally ShellMalloc.Free(Buffer); end; end; end;
joe ... Hvis du har en enterprice version af Delphi kan du se hvordan borland laver deres dims ... Den kan du jo blot kopiere og så modificere bagefter ....
>>borrisholt *hulk hulk, snøft* Jeg har kun Delphi 5 Professional, så jeg må klare mig med det jeg har... :(
Hvad er det også helt præcist for en dims jeg skal se på? Er det SelectDirectory-funktionen der findes i FileCtrl.pas, for så har jeg den jo... Det er den der er postet ovenfor!
Jaaah, men den ser sådan lidt gammel og kedelig ud... Ved godt hvad der er for en! Ville være rarest hvis det kunne blive den anden! :) Nu vi er i gang, så ville endnu en edit til søge-filter også være rart! :)
Ind til videre har jeg løst problemet ved at kalde SelectDirectory, så en Application.MessageBox der spørger om man vil søge i underbiblioteker og til sidst en InputBox der spørger efter søge-filter...
Det er lidt træls (godt jydsk udtryk) at man skal i gennem 3 dialoger for at blive færdig... :)
Jeg forøger gerne pointantallet hvis det kan gøre en forskel!
Jaaaah, det kunne jeg jo... Jeg tror bare at brugeren ville kigge lidt underligt den... F.eks. er der en [?]-box i Caption ved siden af [X]-knappen... Den skal vise nogle hints over komponenterne når man trykker på dem, og disse skal være på rette sprog... :(
Der kommer til at være en masse detalier som bliver svære at pudse af. Samtidig tror jeg ikke at den netværkskode jeg har til søgning er hurtig nok til at kunne bruges i de sammenhænge... :(
du kan implementere Win exploreren på en form med nogle edit boxe, men jeg ved ikke hvordan du lave extra kode der bliver kørt af Win exploreren. Eller prøv at kig i API hjælpen søg evt. efter BIF_EDITBOX der må da findes en BIF_CHECKBOX som du så kan prøve at pluse på.
>>martinlind Jeg har prøvet at kigge lidt efter den bog du snakkede om, men desværre uden resultat... Har du eventuelt et link jeg kan bruge?
>>borrisholt Det ser bare enormt godt ud!!! :) Jeg skal lige ha' kigget lidt nærmere på klassen, når det så er gjort er det vel egentlig bare at arve fra den og så klistre nogle komponenter på! ;)
Siger tak ind til videre, men venter lige med at lukke til det virker 100%! :)
Borrisholt fik lidt flere point på grund af et sværere spørgsmål, men tusind tak til jer begge to! :)
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.