Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListView [Delphi, Windows]


Страницы:   1 2

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?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо