![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListView [Delphi, Windows]
Robt © (2007-06-09 19:39:00)А как сделать чтобы элементы ListView не выделялись правой кнопкой мыши ?
Robt (2007-09-18 19:01:00) [1]А как оно работает ?
Vladimir Kladov (2007-09-18 17:08:00) [2]За раз можно и без указателей. Достаточно оба сделать виртуальными и в OnData брать данные из одного и того же места.
Robt (2007-09-18 15:37:00) [3]можно ли через указатели
"за раз" скопировать все итемы из одного в другой листвиев?
точней в первом они создаются а второй к ним "подключается" и все
изменения в первом видны во втором и наоборот
Demt (2007-08-05 08:26:00) [4]Теперь понял алгоритм, а то что-то в голове вырисовывалось, но не до конца. Про LVItems я знаю, это даже лучше чем в VCL.
Дмитрий К: Спасибо за предоставленный код.
Дмитрий К (2007-08-04 21:55:00) [5]
> Жду вразумительного ответа
На какой вопрос?
Пример загрузки-сохранения:
program svldlv;
uses
{Windows, Messages,} Kol;
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
form, btn1, btn2, lv: PControl;
public
procedure DoClick1(Sender: PObj);
procedure DoClick2(Sender: PObj);
procedure LoadList(Path: string; Delimiter: Char);
procedure SaveList(Path: string; Delimiter: Char);
end;
var
Form1: PForm1;
procedure NewForm1(var Result: PForm1; AParent: PControl);
var i, j: Integer;
begin
New(Result, Create);
with Result^ do
begin
form := NewForm(AParent, 'Form1');
form.Add2AutoFree(Result);
Applet := form;
lv:=NewListView(form, lvsDetail, [], nil, nil, nil).SetClientSize(600,400).ResizeParentRight;
lv.LVColAdd('Column0', taLeft, 150);
lv.LVColAdd('Column1', taLeft, 150);
lv.LVColAdd('Column2', taLeft, 150);
lv.LVColAdd('Column3', taLeft, 150);
for i := 0 to 20 do
begin
lv.LVItemAdd('Item ' + Int2Str(i));
for j := 1 to lv.LVColCount - 1 do
begin
lv.LVItems[i, j] :='SubItem ' + int2str(i) + ':' + int2str(j);
end;
end;
btn1 := NewButton(form, 'Load').PlaceUnder;
btn1.OnClick := DoClick1;
btn2 := NewButton(form, 'Save').PlaceRight.ResizeParentBottom;
btn2.OnClick := DoClick2;
end;
end;
{ TForm1 }
procedure TForm1.LoadList(Path: string; Delimiter: Char);
var Sl: PStrList; S: string; ColCount, i, j: Integer;
begin
Sl := NewStrList;
try
Sl.LoadFromFile(Path);
S := Sl.Items[0];
for i := Lv.LVColCount - 1 downto 0 do
Lv.LVColDelete(i);
for i := Lv.LVCount - 1 downto 0 do
Lv.LVDelete(i);
ColCount := 0;
for i := 1 to Length(S) do
begin
if S[i] = Delimiter then
inc(ColCount);
end;
// inc(ColCount);
for i := 0 to ColCount {- 1} do
Lv.LVColAdd('Column ' + int2str(i), taLeft, 150);
for i := 0 to Sl.Count - 1 do
begin
S := Sl.Items[i];
Lv.LVItemAdd(Parse(s, Delimiter));
for j := 1 to ColCount {- 1} do
Lv.LVItems[i, j] := Parse(S, Delimiter);
end;
finally
Sl.Free;
end;
end;
procedure TForm1.SaveList(Path: String; Delimiter: Char);
var i, j: integer; Stream: PStream;
begin
Stream := NewWriteFileStream(Path);
try
for i := 0 to lv.LVCount - 1 do
begin
Stream.WriteStr(lv.LVItems[i, 0]);
for j := 1 to lv.LVColCount - 1 do
begin
Stream.WriteStr(Delimiter + lv.LVItems[i, j]);
end;
Stream.WriteStr(#13#10);
end;
finally
Stream.Free;
end;
end;
procedure TForm1.DoClick1(Sender: PObj);
begin
LoadList('lv.txt', '|');
end;
procedure TForm1.DoClick2(Sender: PObj);
begin
SaveList('lv.txt', '|');
end;
begin
NewForm1(Form1, nil);
Run(Applet);
end.
Vladimir Kladov (2007-08-04 21:53:00) [6]У нас LVITems[ line, col ]. SubItems нет и не будет.
Demt (2007-08-04 19:08:00) [7]Дабы не плодить лишних тем пишу в эту ветку.
Нужно организовать из ListView загрузку/сохрание в текстовый файл с разделителями.
Нашел требуемое для VCL.
Вот пример сохранения (VCL):
Procedure SaveListView(S: String; ListView: TListView);
Const Delimiter = '|';
Var ff: TextFile;
t: Integer;
begin
AssignFile(ff, S);
ReWrite(ff);
try
With ListView Do For t:=0 to Items.Count - 1 Do
WriteLn(ff,StringReplace(Items[t].Caption + Delimiter + Items.Item[t].SubItems.Text,#13#10,Delimiter,[rfReplaceAll]));
finally
CloseFile(ff);
end;
end;
Нет нужных методов, таких как SubItems.Text.
StringReplace заменяется на StrReplace, и выносится отдельной строкой..
Жду вразумительного ответа
domo (2007-07-24 11:14:00) [8]Разобрался на досуге с system.pas из Д7. Не знаю, насколько это оптимально, но пришлось выдрать 2 функции:
function UnicodeToUtf8(Dest: PChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal; // UnicodeToUtf8(4)
function Utf8Encode(const WS: WideString): {UTF8}String; // я заменил на String, т.к. не нашел в КОЛ UTF8String
А сохраняю так:
if StrSaveToFile(ExtractFileNameWOext(DicFName)+'_new.txt', UTF8Encode(SListW.Text))
then Form1.Form.StatusText[1]:=PChar('Файл сохранён.')
else Form1.Form.StatusText[1]:='Ошибка при сохранении файла!';
Вроде все работает, спасибо Дмитрий К и mdw за помощь и за файл.
Если можно сделать проще, надежнее (вроде бы последний символ может заменяться на #0 ?), быстрее - напишите.
P.S. Не вставил еще ресурс картинки на кнопки (Не ставятся никакие пакеты), но я срочно на неделю уехал на море, приехал, а тему закрыли.
Надо будет через недельку еще попробовать и именно через Д5, не хочется свою собственную программу кромсать Ресторатором.
domo (2007-07-13 17:03:00) [9]mdw: получил, спасибо. Посмотрю на досуге, наверняка что-то пригодится.
Дмитрий К: это непросто для меня, но спасибо, попробую.
mdw (2007-07-13 16:14:00) [10]Послал. Там 2 письма, первый раз забыл сам файл прикрепить.:)
Дмитрий К (2007-07-13 15:50:00) [11]
> А сохранять как,
Например, использовать функцию UTF8Encode из модуля system.pas из D7
domo (2007-07-13 15:35:00) [12]Дмитрию К: А сохранять как, а то
sListW.SaveToFile(ExtractFileNameWOext(ks)+'(New).txt');дает мне файл не UTF, а Unicode.
domo (2007-07-13 15:07:00) [13]mdw: Знаешь, все-таки пришли, вдруг я еще что-то захочу преобразовать: dom3me СОБАЧКА yahoo.com
domo (2007-07-13 15:01:00) [14]Ох ты, прошу прощения, работает! Я же поставил и забыл потом снять преобразование UTF8_2WideString с
procedure TForm1.lvWOnLVData. Огромное спасибо Дмитрию К.
mdw (2007-07-13 14:40:00) [15]Куда прислать? или письмо мне напиши, пришлю system.pas. Кстати в kolatl.7z должны быть, я в свое время добавлял для совместимости с Д5.
domo (2007-07-13 14:36:00) [16]Увы,
WStrList.SetText(UTF8_2WideString(StrLoadFromFile(ks)));не работает: латынь видна, кириллица - крякозябликами, в конце почти каждой строчки с десяток знаков вопроса. Да и Кладов уже мне писал, что "UTF-8 - это не WideString".
А можно к этому форуму прикрепить файл system.pas из Д7? Я бы в нем поковырялся насчет функций про к-рые писал mdw... Или может уже у кого-то есть выдранные?
Дмитрий К (2007-07-13 13:05:00) [17]
> domo (11.07.07 09:54) [19]
>
> Нет, не всё так просто (для меня конечно, для остальных-
> то, думаю, всё ясно).
> Я просмотрел kol.pas, выбрал функцию UTF8_2WideString (более
> подходящего не нашел), поменял слегка свой код, но - не
> работает. Строки-то читаются в ListView, но в конце почти
> каждой строки - мусор из знаков вопроса и крякозябликов.
> Меня замучили крякозяблики вместо табуляции, а тут еще
> и эти. А может быть ошибка в функции UTF8_2WideString или
> где-то не тот тип я использую?
>
Преобразуй при загрузке:
WStrList.SetText(UTF8_2WideString(StrLoadFromFile('файл')));
mdw (2007-07-13 12:47:00) [18]
> А как же я посмотрю, если у меня только Д5?
Можно всять System из Д7 и выдрать нужное.
=BuckLr= (2007-07-13 12:30:00) [19]
> А как же я посмотрю, если у меня только Д5?
Нету в систем. В КОЛ смотри
domo (2007-07-13 09:11:00) [20]А как же я посмотрю, если у меня только Д5?