Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2010, 12:28   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Вопрос Заполнить StringGrid из дерева

Доброе утро! Как можно получить заполненный StrinGrid из дерева, которое выглядит как на рисунке слева? Предполагаю, что дерево будет отображаться в ShellTreeView. Может есть другой способ?
Изображения
Тип файла: jpg Безымянный.jpg (60.6 Кб, 134 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.09.2010, 13:07   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

А дерево откуда заполняется? Может можно заполнить заранее?
Хотя из дерева заполнить тоже не проблема, пройтись рекурсивно по всем детям.

В чем проблема-то, не очень понятно.
_Engine_ вне форума Ответить с цитированием
Старый 11.09.2010, 13:12   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
А дерево откуда заполняется?
Да дерева-то как такового и нету. Просто на рисунке пример того, как может это дерево отображаться через ShellTreeView.

Цитата:
В чем проблема-то, не очень понятно.
Ну как бы в коде и проблема
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.09.2010, 13:26   #4
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Дам один совет, если дерево довольно-таки большое, то не заполнять его целиком сразу, а заполнять только видимые в данный момент ветки.
Хранить информацию можно в поле Data : Pointer, у каждой ветки есть такое поле.
_Engine_ вне форума Ответить с цитированием
Старый 11.09.2010, 13:34   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Дерево будет довольно таки большое. Кодом можешь помочь? Я с деревьями как-то не очень.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.09.2010, 14:03   #6
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Ну вот для примера, как было сделано у меня в одном из проектов:
Код:
procedure TFormEquipmentList.FillNodesWithOneDown(Node: TTreeNode);
 var MyTreeData : PMyTreeData;
begin
  if dsEQ.Active then dsEQ.Close;
  If Node <> nil then
  begin
    Node.DeleteChildren;
    if assigned(Node.Data) then
    begin
      dsEQ.ParamByName('ID_IN').Value := PMyTreeData(Node.Data)^.ID;
      PMyTreeData(Node.Data)^.Filled := 1;
    end;
  end else
    dsEQ.ParamByName('ID_IN').Value := null;

  dsEQ.Open;
  while not dsEQ.Eof do
  begin
    if GetNodeByID(dsEQID.Value) = nil then
    begin
      Node := eqTree.Items.AddChild(GetNodeByID(dsEQID_UP.Value),dsEQNAME.Value);
      New(MyTreeData);
      MyTreeData^.ID := dsEQID.Value;
      MyTreeData^.ID_UP := dsEQID_UP.Value;
      if not dsEQID_TECH.IsNull then
        MyTreeData^.ID_TECH := dsEQID_TECH.Value
      else MyTreeData^.ID_TECH := 0;
      MyTreeData^.Filled := 0;
      Node.Data := MyTreeData;
    end;
    dsEQ.Next;
  end;
end;


function TFormEquipmentList.GetNodeByID (ID : Integer) : TTreeNode;
var nd : TTreeNode;
begin
  result := nil;
  nd := EQTRee.Items.GetFirstNode;
  while nd <> nil do
  begin
    if assigned(nd.Data) then
      if PMyTreeData(nd.Data)^.ID = ID then
      begin
        result := nd;
        Exit;
      end;
    nd := nd.GetNext;
  end;
end;

procedure TFormEquipmentList.EqTreeExpanding(Sender: TObject;
  Node: TTreeNode; var AllowExpansion: Boolean);
begin
  if assigned(NOde) then
    if PMyTreeData(Node.Data)^.Filled = 0
    then
      FillNodesWithOneDown(Node);
end;
_Engine_ вне форума Ответить с цитированием
Старый 11.09.2010, 15:14   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Вот код, который создает такое дерево:
Код:
procedure TFileThread.Execute;
function CCopy(S, C1, C2: string): string;
begin
  if C1 <> '' then
    Delete(S, 1, Pos(C1, S) + Length(C1) - 1);
  if C2 <> '' then
    Delete(S, Pos(C2, S), Length(S));
  Result := S;
end;
var
  searchResult: TSearchRec;
  i, o: Integer;
  NameDir, NameFile, Buff: string;
begin
    if FindFirst(Form1.Label3.Caption + '\*.pdf', faAnyFile - faDirectory, searchResult) = 0 then
    begin
      repeat
        Buff := searchResult.Name;
        Delete(Buff, 1, Pos('_', Buff));
        Form1.ListBox2.Items.Add(Buff);
        Form1.StatusBar1.Panels[3].Text := IntToStr(Form1.ListBox2.Items.Count) + ' шт.';
        Application.ProcessMessages;
      until FindNext(searchResult) <> 0;
      FindClose(searchResult);
    end;
    for i := 0 to Form1.ListBox2.Count - 1 do begin
      NameDir := Form1.Label3.Caption + '\' + CCopy(Form1.ListBox2.Items.Strings[i],'_','.');
      if not DirectoryExists(NameDir) then
        ForceDirectories(NameDir);
      NameFile := Form1.Edit1.Text + '_' + Form1.ListBox2.Items.Strings[i];
      CopyFile(PAnsiChar(Form1.Label3.Caption + Form1.ListBox2.Items.Strings[o] + '\' + NameFile),
               PAnsiChar(NameDir + '\' + NameFile + ExtractFileExt(Form1.ListBox2.Items.Strings[i])), False);
      //DeleteFile(Edit1.Text + ListBox1.Items.Strings[o] + '\'+ListBox2.Items.Strings[i]);
    end;
end;
в Form1.Label3.Caption хранится путь к папке, т.е. как в данном случае на рисунке это папка 400. Как его переделать, чтобы получить такую таблицу (см. ниже)? В колонке "исходный файл" можно хранить полный путь к файлу (так было бы даже лучше)
Изображения
Тип файла: jpg Безымянный.jpg (116.1 Кб, 116 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.09.2010, 15:25   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Путь к файлу есть? и нафиг тебе вообще дерево?
пропарсь имя файла и найди все что тебе нужно
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 11.09.2010, 15:33   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Если бы я знал как сделать таблицу, что мне нужно, я бы не спрашивал так-то.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.09.2010, 15:39   #10
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

у тебя есть имена файлов? так?
типа вот этого
400_8_212861.pdf
теперь
Код:
s1:='400_8_212861.pdf';
s:=s1;
srgd1.cells[0,1]:=copy(s,1,pos('_',s));
delete(s,1,pos('_',s));
srgd1.cells[1,1]:=copy(s,1,pos('_',s));
delete(s,1,pos('_',s));
srgd1.cells[2,1]:=copy(s,1,pos('.',s));
srgd1.cells[5,1]:=s1;
грузишь все названия файлов в Stringlist и в цикле проходишь)
только вместо 1 вот тут srgd1.cells[0,1] и далее по тексту ставишь N строки в Stringlist-е
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заполнить StringGrid (Delphi) kaa1977 Помощь студентам 1 13.11.2009 08:40
Как заполнить StringGrid???? Anna_new Помощь студентам 15 19.04.2008 00:34
Заполнить TTreeView Leonis Компоненты Delphi 6 27.03.2008 13:02
обход дерева ribka Помощь студентам 2 11.12.2007 20:38
Как заполнить StringGrid "стрелочкой" ? mEka Компоненты Delphi 1 16.12.2006 20:15