Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: Kursist
Дата сообщения: 27.11.2009 20:03
data man
Спасибо за ссылку. Очень интересно было узнать.

ppkp
Я понял так: в классе дополнительную процедуру, которую себе же присвоишь, не опишешь - так как в классе неизвестно окружение, в котором будет находиться объект. К тому же, это более абстрактная сущность, желательно, самодостаточная. То есть, в любом случае должна присваиваться внешняя процедура. Статья по ссылке от data man очень понравилась.

V1s1ter
Да, извините, может и я чего не так понял. Но попытался объяснить свое понимание явления.
Спасибо.
Автор: snike555
Дата сообщения: 27.11.2009 22:28
Помогите пожалуйста этот кусок для 2010 делфи скомпилить, конкретно аналог функции AnsiStrLIComp не могу в юникоде найти

procedure TFrm1.VTIncrementalSearch(
Sender: TBaseVirtualTree; Node: PVirtualNode;
const SearchText: String; var Result: Integer);
var
Data : PData;
begin
Result := 0;
Data := VT.GetNodeData(Node);
if Assigned(Data) then
begin
if IsIntNumber(SearchText) then
Result := AnsiStrLIComp(PChar(SearchText),
PAnsiChar(AnsiString(Data^.ID)),
Min(Length(SearchText), Length(Data^.ID)))
else
Result := AnsiStrLIComp(PChar(SearchText),
PChar(Data^.R_NAME),
Min(Length(SearchText), Length(Data^.R_NAME)));
end;
end;
Автор: whitewolfs
Дата сообщения: 28.11.2009 05:51
Помогите плиз, не могу вроде простейшую задачу выполнить.
Есть форма, на неё кидаю три TPanel + два TSplitter. Нужно чтобы панели делили форму на 3 области и размеры изменялись сплитерами вот так:

--------------------------
| | |
| |----------------|
| | |
| | |
--------------------------

а получается только так:

--------------------------
| | |
| | |
|------------------------|
| |
--------------------------

Может кто нибудь подсказать или скинуть форму с нужным расположением панелей?
Автор: psa1974
Дата сообщения: 28.11.2009 09:00
whitewolfs
кидаешь на форму 2 панели, разделяешь вертикальным сплитером. На правую панель кидаешь еще 2 панели, разделяешь горизонтальным сплиттером.
Автор: VMan80
Дата сообщения: 28.11.2009 09:56
Туплю с TreeView, прошу помочь.
Имеем многуровневое "дерево", например:

Node1
---Level1
--Level1
----Level2
----Level3
Node2
---Level1
----Level2
----Level3
и т.д.

Вопрос, как программно перейти на Node1.Level1? Следующий код не срабатывает:
var
node : TTreeNode;
begin
node := TreeView1.Items[1];
node.GetNextChild(node); // вместо следующего уровня выбранного узла почему-то осуществляется переход на следующий узел
end;

Автор: Frodo_Torbins
Дата сообщения: 28.11.2009 11:38
VMan80
У TTreeNode тоже есть свойство Item
Автор: psa1974
Дата сообщения: 28.11.2009 11:57
VMan80
Всю жизнь индексы в списках отсчитываются с нуля. Строкой node := TreeView1.Items[1]; ты переходишь на узел, имеющий индекс 1 но по счету он второй.
Автор: VMan80
Дата сообщения: 28.11.2009 11:59
Frodo_Torbins
Это я в курсе Но что дальше? К примеру: node.Item[0].Text или даже так: TreeView1.Items[1].Item[0].Text; выдает ошибку "List index out of bounds..

Изначальная задача такая. Пишу компонент для выбора папки (директории) на основе TreeView. Вернее он практически уже готов. Хочу реализовать функцию, чтобы при запуске в дереве TreeView открывалась заданная папка (ветка). К примеру: C:\Test\1\. Хочу сделать так (думаю наиболее оптимальный по скорости работы путь, если нет - поправьте): из искомой строки в цикле поочередно выделяю сегмент для поиска: "C:\", "Test\" и "1\", которые затем поочередно буду искать в каждом соответствующем уровне дерева TreeView.
С первым уровнем все понятно (пример условный):
SearchStr := "C:\";
CurItem: = TreeView1.Items.GetFirstNode;
while CurItem<>nil do
begin
if CurItem.Text = SearchStr then
// вот тут нужно выполнить переход на следующий Level, чтобы пройти по его Item-am Но вот как?
// если указать CurItem := CurItem.GetNextChild(CurItem); - то происходит переход на следующий Item
// на этом же уровне дерева, а мне надо перейти на новый Level !!!!!
else
CurItem: = CurItem.GetNext;
end;

Автор: snike555
Дата сообщения: 28.11.2009 11:59
функция AnsiStrLIComp - юникод аналог кто-нибудь подскажет?
Автор: psa1974
Дата сообщения: 28.11.2009 12:19
snike555

Цитата:
функция AnsiStrLIComp - юникод аналог кто-нибудь подскажет

ничего военного, взято из Дельфи 2010, смотри за #
Автор: whitewolfs
Дата сообщения: 28.11.2009 12:43
psa1974

Цитата:
кидаешь на форму 2 панели, разделяешь вертикальным сплитером. На правую панель кидаешь еще 2 панели, разделяешь горизонтальным сплиттером.


Спасибо, видимо так и придется делать.
Автор: psa1974
Дата сообщения: 28.11.2009 13:12
VMan80

Код:
CurItem:= TreeView1.Items.GetFirstNode;
begin
if (CurItem.Text = SearchStr) and (CurItem.Count > 0) then
begin
// переход на след. вложенный узел:
CurItem:= CurItem.getFirstChild;
// переход на след. пункт в текущем узле:
while Assigned(CurItem) and (CurItem.Text <> SearchStr) do
CurItem:= CurItem.GetNextChild(CurItem);
end
else
CurItem:= CurItem.GetNext;
end;
Автор: VMan80
Дата сообщения: 28.11.2009 16:11
psa1974
Спасибо, но не работает это все. Буду разбираться дальше.

Автор: psa1974
Дата сообщения: 28.11.2009 16:38
VMan80
Или я тебя не понял, или одно из двух То как я понял, работает. Посмотри пример Ссылка тут я начинаю сканировать дерево с самого начала, пока не найду узел с именем '113333', в метку на форме вывожу имя текущего узла...
Автор: VMan80
Дата сообщения: 28.11.2009 17:01
psa1974
Не рабочий это код

Суть. Имею дерево:

Хочу, чтобы при запуске открывалась ветка D:\10\11\
Начало пробного кода:


Код:
procedure TForm1.Button3Click(Sender: TObject);
var
i, j : integer;
s,a: string;

begin
s := 'D:\10\11\'; // тестовая строка для поиска
j:=0;
node := TreeView1.Items.GetFirstNode;
while Pos('\',s) > 0 do
begin
a:=Copy(s,1,Pos('\',s)); // искомая строка. При первой итерации "D:\"
s:=Copy(s,Pos('\',s)+1,Length(s)-Pos('\',s)+1);
j := j + 1;
if length(a)>1 then
begin
if j = 1 then
begin
for i := 0 to TreeView1.Items.count-1 do // сканирую корень дерева в поиске узла "D:\"
if TreeView1.items[i].Text = a then
break
else
node:=node.GetNextChild(node); // нашел, сохранил node
end
else
if (node <> nil) and (node.HasChildren = true) then // узел "D:\" найден, далее нужно найти "10" на следующем уровне
begin
node:=node.GetFirstChild; // И ТУТ ОБЛОМ - NODE становится NIL, хотя мне нужно перейти на следующий Level
while Assigned(node) and (Node.Text <> a) do
begin
node:=node.GetNextChild(node);
// остальное тра-та-та будет потом
end;
end;
end;
end;
end;
Автор: data man
Дата сообщения: 28.11.2009 17:19
VMan80
А почему бы не использовать VirtualShellTools ?
Исходники брать лучше из SVN

Или Virtual Shell Tree


Или стоит задача написать именно свой компонент ?
Автор: VMan80
Дата сообщения: 28.11.2009 17:34
data man
Спасибо, попробую. Но и самому разобраться тоже интересно.

Добавлено:
data man

Цитата:
А почему бы не использовать VirtualShellTools ?


Цитата:
Или Virtual Shell Tree

Попробовал - использовать не лучше. Страшно все тяжеловесное и тормозное. Скомпилированый exe на основе проекта с формой, на которой брошен один лишь такой объект тянет почти на 800 Кбайт. В Virtual Shell Tree сортировка дисков в дереве не по букве, а по типу (Локальный, Съемный и т.д.), т.е. каша полная. А по сути все это более навороченные варианты стандартного ShellTreeView с тем же скрежешущим дисководом при раскрытии ветки "Мой компьютер". Для реализации простейшей функции выбора папки на форме - все это слишком чересчур. Я таких компонент уже около десятка опробовал - фтопку все.
Автор: psa1974
Дата сообщения: 28.11.2009 20:48
VMan80
Возьми пример:Ссылка или #
Сдесь в конструкторе строится виртуальное дерево каталогов, затем по нажатию кнопки ищется конечная папка пути, указанного в окне ввода. Вроде это то что ты хочешь...

Автор: VMan80
Дата сообщения: 29.11.2009 09:17
psa1974
Спасибо!!
Я понял, где тупил: в целях ускорения построения дерева каталогов, у меня новый уровень строился только при его раскрытии. То есть несмотря на то, что HasChild был выставлен в true, узел далее был пустым. Соответственно не срабатывало GetNextChild. Вобщем алгоритм получился несколько другой:


Код:
function GetPath(Path: string; TreeView: TTreeView): boolean;
var
i, j : integer;
a: string;
begin
j:=-1; // Level
node := TreeView.Items.GetFirstNode;
while Pos('\',path) > 0 do
begin
a:=Copy(path,1,Pos('\',path)-1); // искомая строка
path:=Copy(path,Pos('\',path)+1,Length(path)-Pos('\',path)+1); // "остаток" строки для последующего поиска
j := j + 1;
if length(a)>1 then
begin
if j = 0 then
begin
for i := 0 to TreeView.Items.count-1 do
if TreeView.items[i].Text = a+'\' then
break
else
node:=node.GetNextChild(node);
end
else
if (node <> nil) and (node.HasChildren = true) then
begin
node.Expanded := true; // тут у меня заполняются чилдрены следующего уровня текущего нода
while node <> nil do
if Node.Text = a then break
else node:=node.GetPrevSibling;
end;
end;
end;
if node <> nil then
begin
node.Selected:=true;
TreeView.SetFocus;
result:=true
end
else
result:=false;
end;

соответственно вызов:
procedure TForm1.Button4Click(Sender: TObject);
begin
GetPath('D:\10\11\',TreeView1);
end;
Автор: psa1974
Дата сообщения: 29.11.2009 10:02
VMan80
Я рад, что получилось.

Цитата:
в целях ускорения построения дерева каталогов, у меня новый уровень строился только при его раскрытии

Ну а вот если бы ты это сказал с самого начала... получилось бы быстрее. Среди нас тут вроде как телепатов нету...
Автор: snike555
Дата сообщения: 29.11.2009 14:21
psa1974


Цитата:
snike555

Цитата:
функция AnsiStrLIComp - юникод аналог кто-нибудь подскажет

ничего военного, взято из Дельфи 2010, смотри за #


Не попнял, где смотреть?
Автор: ppkp
Дата сообщения: 29.11.2009 14:47
snike555
Нажмите в интересующем Вас сообщении на "Редактировать"
Автор: psa1974
Дата сообщения: 29.11.2009 16:29
snike555
на всякий случае еще вот объявление используемой внутри функции AnsiStrLIComp функции CompareStringW:

Код:
function CompareStringW(Locale: LCID; dwCmpFlags: DWORD; lpString1: PWideChar;
cchCount1: Integer; lpString2: PWideChar; cchCount2: Integer): Integer; stdcall;
Автор: snike555
Дата сообщения: 29.11.2009 18:05
psa1974

Цитата:
на всякий случае еще вот объявление используемой внутри функции AnsiStrLIComp функции CompareStringW:


Спасибо, как-то не заметил что там WideChar есть, нужно будет повторно проверить почему у меня не работало.
Автор: MikhR
Дата сообщения: 30.11.2009 12:50
Люди помогите с Делфи...
в общем есть ехлибовский грид , включена опция multiSelect.
при добавлении новой строки выделялся весь грид!
в Ехлиб 3.6 была исправлено следующим образом - на событие OnSelectionChanged было навешано условие SelectedRows.Clear
и все работало.

Вот на днях поставил новый ехлиб и теперь при попытке добавить строку - из этого события OnSelectionChanged не выходит - зацикливается...
ЗЫ помогите новичку )
Автор: DmitryKz
Дата сообщения: 30.11.2009 13:06
Ребята, подскажите, как программным способом скроллировать TRichEdit? У меня два окна с текстами: один TRichViewEdit (Сергея Ткаченко) и второй стандартный TRichEdit. Мне нужно скроллировать по вертикали второй в зависимости от первого. Но в первом, понятно, длина по вертикали указана. Теперь мне надо скролливать второй в процентном, так сказать, соотношении от первого. То есть как-то узнать высоту по вертикали текста в TRichEdit. Как все это можно сделать?
Автор: ppkp
Дата сообщения: 30.11.2009 14:41
Подскажите, пожалуйста, где взять самый простой парсер строки. TParser в Delphi всем хорош, но воспринимает символ '(' как разделитель, и пока победить это не удалось.
Автор: psa1974
Дата сообщения: 30.11.2009 15:03
ppkp
Попробуй регулярные выражения. По началу трудно, но потом понимаешь, что это - сила. Можно взять TPerlRegEx
в теме Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus, можно более простой TRegExpr, в инете полно ссылок...
Автор: ppkp
Дата сообщения: 30.11.2009 17:12
Спасибо, взял TRegExpr Сорокина.
Автор: psa1974
Дата сообщения: 30.11.2009 19:41
DmitryKz
Скроллировать надо построчно или плавно?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.