Avatar billede hermandsen Juniormester
03. august 2002 - 13:43 Der 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 har lavet et lille eksempel her:
http://nowle.homepage.dk/selectdir.jpg

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...

På forhånd tak!

//hermandsen
Avatar billede martinlind Nybegynder
03. august 2002 - 13:50 #1
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.

/Martin
Avatar billede martinlind Nybegynder
03. august 2002 - 13:53 #2
jeg forstår ikke helt hvad du skal bruge det extra til, selectdirectory kan da vise hele din disk.
Avatar billede hermandsen Juniormester
03. august 2002 - 13:54 #3
>>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... :/
Avatar billede martinlind Nybegynder
03. august 2002 - 13:54 #4
ad 2 - extra) Det er for øvrigt også en godt ting at blive fortrolig med OOP delphi er ren OOP kode.
Avatar billede hermandsen Juniormester
03. august 2002 - 13:56 #5
>>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!
Avatar billede hermandsen Juniormester
03. august 2002 - 14:00 #6
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?
Avatar billede martinlind Nybegynder
03. august 2002 - 14:09 #7
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.
Avatar billede hermandsen Juniormester
03. august 2002 - 14:15 #8
Takker!
Jeg laver lige et par søgninger! ;)

Kan du svare på mit andet spørgsmål også?
Avatar billede martinlind Nybegynder
03. august 2002 - 17:48 #9
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.

/Martin
Avatar billede hermandsen Juniormester
03. august 2002 - 20:16 #10
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å?
Avatar billede martinlind Nybegynder
03. august 2002 - 20:32 #11
du kan bare kopi'ere sourcen og ændre den :)
Avatar billede hermandsen Juniormester
04. august 2002 - 23:09 #12
Jaaah, tak... Det er så bare lige hvordan!!! ;)

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;


Hvad er det så lige der mangler? :)
Avatar billede borrisholt Novice
08. august 2002 - 16:35 #13
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 ....

Jens B
Avatar billede hermandsen Juniormester
08. august 2002 - 17:08 #14
>>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!
Avatar billede martinlind Nybegynder
08. august 2002 - 17:47 #15
Der er en hvor de selv bygger en form op med comp. på, det var den kode du kunne låne
Avatar billede hermandsen Juniormester
08. august 2002 - 17:55 #16
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!
Avatar billede martinlind Nybegynder
08. august 2002 - 17:58 #17
Jamen så må du jo igen med en Form, TTreeView og et par Edit-Felter

/Martin
Avatar billede martinlind Nybegynder
08. august 2002 - 17:59 #18
Det tager ikke mange nano ( også et godt udtryk ) at lave :)
Avatar billede hermandsen Juniormester
08. august 2002 - 18:45 #19
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... :(

Andre forslag?
Avatar billede martinlind Nybegynder
08. august 2002 - 18:55 #20
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å.

/Martin
Avatar billede hermandsen Juniormester
08. august 2002 - 19:04 #21
I ShlObj er der kun følgende:

  {$EXTERNALSYM BIF_RETURNONLYFSDIRS}
  BIF_RETURNONLYFSDIRS  = $0001;  { For finding a folder to start document searching }
  {$EXTERNALSYM BIF_DONTGOBELOWDOMAIN}
  BIF_DONTGOBELOWDOMAIN  = $0002;  { For starting the Find Computer }
  {$EXTERNALSYM BIF_STATUSTEXT}
  BIF_STATUSTEXT        = $0004;
  {$EXTERNALSYM BIF_RETURNFSANCESTORS}
  BIF_RETURNFSANCESTORS  = $0008;
  {$EXTERNALSYM BIF_EDITBOX}
  BIF_EDITBOX            = $0010;
  {$EXTERNALSYM BIF_VALIDATE}
  BIF_VALIDATE          = $0020;  { insist on valid result (or CANCEL) }

  {$EXTERNALSYM BIF_BROWSEFORCOMPUTER}
  BIF_BROWSEFORCOMPUTER  = $1000;  { Browsing for Computers. }
  {$EXTERNALSYM BIF_BROWSEFORPRINTER}
  BIF_BROWSEFORPRINTER  = $2000;  { Browsing for Printers }
  {$EXTERNALSYM BIF_BROWSEINCLUDEFILES}
  BIF_BROWSEINCLUDEFILES = $4000;  { Browsing for Everything }

Det jeg bare ikke helt forstår er hvordan folkene bag Winamp har lavet deres...
Avatar billede borrisholt Novice
09. august 2002 - 08:20 #22
prøv lige http://borrisholt.com/eksperten/Browsedr.zip

Og så lad os arbejde der fra ....

Jens B
Avatar billede hermandsen Juniormester
11. august 2002 - 23:58 #23
>>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%! :)
Avatar billede martinlind Nybegynder
12. august 2002 - 16:30 #24
http://community.borland.com/article/0,1410,20803,00.html

gå ned til afsnittet :

Turbo Pascal 5.5 Object-Oriented Programming Guide

( Ved ikke om den er på dansk )

/Martin
Avatar billede hermandsen Juniormester
21. august 2002 - 10:55 #25
Borrisholt, kast lige et svar... Du har hjulpet mig på rette vej! :)
Avatar billede hermandsen Juniormester
26. august 2002 - 22:57 #26
Hmmm...

if not Borrisholt.Answer('242321', 'Hest!') then
  Hermandsen.Answer('242321', 'Lukker spørgsmål. Point til martinlind.');

Du får lige et par dage endnu... :)
Avatar billede borrisholt Novice
28. august 2002 - 12:48 #27
Joeee ... Det kan jeg da godt ....

Jens B
Avatar billede hermandsen Juniormester
28. august 2002 - 13:07 #28
Hurra!!!

Borrisholt fik lidt flere point på grund af et sværere spørgsmål, men tusind tak til jer begge to! :)
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