Ścieżka z SHBrowseForFolder jako wart. InitialDir w OpenDial

0

Na początku chciałbym się przywitać, więc... witam szanownych forumowiczów :-)

W zakresie programowania w Delphi w zasadzie chyba nawet nie raczkuję, więc większość problemów rozwiązuję szperając tu i ówdzie, jednak bez dobrej orientacji jest nieco trudno.

Moje pytanie dotyczy tego, czy istniej możliwość zapisania folderu (a właściwie ścieżki do niego) wskazanego funkcją SHBrowseForFolder jako wartości InitialDir w OpenDialog?
Chodzi o to, żeby wskazując tę ścieżkę, poza np. Editem, czy Labelem, wstawiona ona została do wspomnianego pola w Object Inspectorze. W znalezionym przykładzie, autor wstawiał ją do ShowMessage.
Pomyślałem, żeby spróbować najpierw zapisać tę "wartość" w jakimś obiekcie tekstowym, ale tu pojawia się problem różnicy typu danych.

Uprzejmie proszę o jakieś sugestie.

Pozdrawiam,
d_u

0

Nie bardzo wiem co chcesz zrobić, ale jeżeli chodzi tylko o wybór katalogu to polecam moje rozwiązanie
w gotowcach - konkretnie Dialog do wyboru katalogu a przy
wywoływaniu Open czy SaveDialogu, ja zawsze dla pewności robię coś takiego jak poniżej, oczywiście to
zamiast ExtractFilePath(SaveDialog.FileName) może być ścieżka podana w polu edycyjnym, a do tego ów
pola edycyjnego wcześniej możesz przypisać ścieżkę wybraną z okna dialogowego SHBrowseForFolder,
ale w przeze mnie przygotowanym module i kodzie - latwiej się go obsługuje. Mam nadzieję że o to Ci
chodziło. Jak nie to sorry źle Ciebie może zrozumiałem, ale z ów gotowcem powinieneś sobie poradzić.

  if SaveDialog.Execute = True then
  begin
    SaveDialog.InitialDir := ExtractFilePath(SaveDialog.FileName);
  end;

Najprościej będzie użyć kodu z przykładu w moim gotowcu. Tylko podajesz nazwę OpenDialogu.

  OpenDialog.InitialDir := BrowseDialog.Directory;
0

Dziękuję bardzo za reakcję. Moim celem jest uzyskanie następującego efektu:

  • w części (powiedzmy) konfiguracyjnej aplikacji wskazuję folder, w którym znajdować się będą "przetwarzane" przez programik pliki - dlatego użyłem SHBrowseForFolder;
  • teraz, gdyby udało się wskazaną powyżej ścieżkę przypisać parametrowi InitialDir w OpenDialogu, wybierając (browse) pliki do "przetwarzania" otwierałbym od razu ten folder (bez konieczności przeglądania drzewa katalogów). Jeżeli katalog się zmieni, ponownie wskazuję go SHBrowseForFolder i sprawa załatwiona.

Może brzmi to nieco enigmatycznie, ale mam za małą wiedzę, żeby używać fachowej terminologii. Być może jest łatwiejszy sposób na reazlicację powyższego założenia.

Spróbuję jeszcze wykorzystać podany przez Ciebie fragment kodu... może to będzie to.

Pozdrawiam,
d_u

0

Teraz rozumiem - po prostu robisz konfigurację do programu i chcesz ustalić ścieżkę
jakby "rozpicznij w" czy tam "katalog roboczy" ktory ma być domyslny dla Open lub
Save Dialogu, to moim kodem to załatwisz. Nie ma nic trudnego, pobranie modułu,
wypakowanie go do katalogu porjektu, dodanie do projektu i do sekcji uses, później
stworzenie obiektu według przykłądowego kodu na początku treści mojego artykułu
a później przed zrobieniem OpenDialog.Execute... robisz OpenDialog.InitialDir := i
tutaj na przykład KonfiguracjaForm.DomyslnaSciezkaOtwarciaEdit.Text; albo coś w
tym stylu. Są to banały i podstawy programowania - także powinieneś dać radę :)

0

Dziękuję za wskazówki i przykład rozwiązania. Spróbuję oprzeć się na Twoim "gotowcu". :-)

Pozdrawiam,
d_u

0

Problem poniekąd rozwiązany. Kumulacja kilku pomysłów daje niekiedy ciekawe wyniki. Dziękuję za odpowiedzi.

Nie chcę zakładać kolejnego wątku, więc pozwolę sobie zapytać tu. Czy jest jakaś metoda (zastosowanie konkretnego obiektu(ów)) do stworzenia swego rodzaju listy z możliwością dodawania i usuwania elementów, które następnie można by wykorzystać jako parametry, czy też wartości zmiennej w cyklicznie wykonywanej operacji. Jaśniej: chodzi o stworzenie listy adresów IP (lub nazw sieciowych) komputerów, posiadającej możliwość dodawania nowych i usuwania wskazanych pozycji, a następnie zastosowanie jej (listy) np. w pętli jako metodę wskazywania odbiorców przy wysyłaniu komunikatów sieciowych? Ja zastosowałem obiekt ListBox zapisujący docelowo listę do pliku. Jeżeli istnieją praktyczniejsze rozwiązania ww tematu, proszę o podpowiedź.

Pozdrawiam,
d_u

0

ListBox może być. Jak chcesz więcej danych przechować pod jakąś pozycją,
na przykład oprócz adresu IP jeszcze nazwę hosta albo opis to można użyć,
w obiektach typu TListBox, TStringList, TcomboBox, TListView takiej metody
AddObject i dodawać obiekt, ktory wcześniej tworzysz i nadajesz mu różne
własności typu string - przykładowo mozna zrobić coś takiego jak poniżej:

//...
type
  TCosik = class(TObject)
    Cos1, Cos2 : string;
end;

// Dodawanie.
var
  A : TCOsik;
begin
  A := TCosik.Create;
  A.Cos1 := 'nazwa';
  A.Cos2 := 'coś innego';
  ListBox1.Items.AddObject(A.Cos1, A);
end;

// Wyświetlenie:
procedure TForm1.ListBox1Click(Sender: TObject);
var
  A : TCosik;
begin
  if ListBox1.ItemIndex > -1 then
  begin
    A := TCosik(ListBox1.Items.Objects[ListBox1.ItemIndex]);
    Caption := A.Cos2;
  end;
end;
0

Witam.

Lista zawierać ma jedynie adresy IP (dodatkowe informacje są zbędne). Dodawanie i usuwanie to sprawa oczywista, sortowanie również. Tak stworzoną listę zapisuję do pliku. Zastanawia mnie tylko w jaki sposób wspomnianą listę wykorzystać wraz z "command line'owym" net send do wysłania wiadomości do kilku hostów w sieci? Brałem pod uwagę odpowiednio spreparowane polecenie linii komend FOR /L, ale tam podaje się wyłączenie początkowy i końcowy adres oraz wartość przeskoku.

Jako, że piszę dość enigmatycznie podam co chcę osiągnąć. Mianowicie do komputerów o IP zawartym w liście z ListBox'a, przy użyciu jakiejś pętli, chciałbym posłać net send'em konkretny komunikat. Net send pozwala wysyłać informacje do pojedynczego komputera, userów lub domeny, ale nie do zdefiniowanej grupy hostów (IP). Do tej pory stosowałem metodę "uzupełniania" treści pliku .bat parametrami wskazywanymi na poziomie interfejsu wykonanego w Delphi. Pytanie czy i tu jest to możliwe.

0

Można by w pętli wysyłać odpowiednie polecenie zmieniając tylko jeden z parametrów
na adres IP z danej linijki ListBoxa czyli ListBox1.Items[ListBox1ItemIndex]. A z tego
co kojarzę to komendy net są w oknie konsolowym, więc jeżeli potrzebujesz pózniej z
tego co pokaże się na konsoli odczytać jakiś zwrocony komunikat - to zainteresuj się,
dosyć przydatnym komponentem TDosCommand, a który można znaleźć w googlach.

0
olesio napisał(a)

Można by w pętli wysyłać odpowiednie polecenie zmieniając tylko jeden z parametrów
na adres IP z danej linijki ListBoxa czyli ListBox1.Items[ListBox1ItemIndex].

Poszedłem wskazanym przez Ciebie tropem i udało mi się zrobić pętlę o ilości powtórzeń równej liczbie pozycji ListBox'a. Póki co, dla celów testowych, zamiast wstawić to do odpowiednio przygotowanego "net send'a" postanowiłem wyświetlać wynik jako komunikat. Jednak mam problem z wyświetlaniem "treści" kolejnych pozycji - wyświetlają się wymaganą ilość razy, ale każdy komunikat zawiera całą zawartość ListBox'a. Kod wygląda tak:

x:= ListBox1.Items.Text <-- i tu jest problem
for i:=1 to ListBox1.Items.Count do
ShowMessage(x);

Nie bardzo wiem, jak zmienić pierwszą linię.

Pozdrawiam,
d_u

0

Dlatego się pokazuje całość, bo tak kazałeś. Myślałem, że mając już przykładową własnośc poradzisz sobie
z takim banałem, jak wykorzystanie w pętli poszczególnych elementów ListBox. A powinno być raczej tak:

var
  S : string;
  I : integer;
begin
  for I := 0 to ListBox1.Items.Count - 1 do
  begin
    S := ListBox1.Items[I];
    ShowMessage(S);
  end;
end;

Bo nadawanie zmiennej S całego tekstu z ListBoxa, nie ma sensu. Poza tym elementy ListBoxa indeksowane
są od zera, a nie od 1. To są banalne podstawy i polecam Tobie poczytać na ich temat np. w jakimś kursie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1