Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.15;
Скачать: CL | DM;

Вниз

ListView   Найти похожие ветки 

 
Robt   (2007-06-09 19:39) [0]

А как сделать чтобы элементы ListView не выделялись правой кнопкой мыши ?


 
Vladimir Kladov   (2007-06-09 21:43) [1]

Хм. Вы программист? API изучать надо.

var ChangingState: Boolean;
   LV1RClick: Boolean;
procedure TForm1.ListView1LVStateChange(Sender: PControl; IdxFrom,
 IdxTo: Integer; OldState, NewState: Cardinal);
var i: Integer;
begin
 if ChangingState then Exit;
 if LV1RClick then
 begin
   ChangingState := TRUE;
   if (OldState and LVIS_SELECTED = 0) xor
      (NewState and LVIS_SELECTED = 0) then
       for i := IdxFrom to IdxTo do
         if NewState and LVIS_SELECTED = 0 then
           Sender.LVItemState[ i ] :=
             Sender.LVItemState[ i ] + [ lvisSelect ]
         else
           Sender.LVItemState[ i ] :=
             Sender.LVItemState[ i ] - [ lvisSelect ];
   ChangingState := FALSE;
 end;
end;

procedure TForm1.ListView1MouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if Mouse.Button = mbRight then
   LV1RClick := TRUE
 else
   LV1RClick := FALSE;
end;


 
Robt   (2007-06-10 19:52) [2]

Ой спасибо !!! :)
насчет программиста - у каждого бывает "тупиковый период"


 
domo   (2007-06-29 13:48) [3]

Я снова со своими вопросами про вирт. список. Наверно, в этой ветке будет лучше. Надеюсь, подскажете, кто может:

- как в вирт.списке ListView (да и в EditBox тоже) отображать табуляцию, имеющуюся в строках, считываемых из файла. У меня вместо нее появляется какой-то значок - крякозяблик.

- как проверить, что списки ListView и StrList еще существуют, а не разрушены уже?

- как в списки ListView и StrList читать строки Unicode (UTF), есть какие-то правила?


 
Vladimir Kladov   (2007-06-29 17:02) [4]

Наверное, символ табуляции в list view всегда так отображается. Это наверняка не от виртуальности. Выход - только owner draw.

Остальное... 2е - как-то непонятно. Вы же сами их конструируете и уничтожаете. 3е - совсем непонятно. Так же как и всегда. Там параметр Txt вроде бы KOLString. Для unicode есть WStrList.


 
domo   (2007-07-02 16:55) [5]

Спасибо за 1 и 3. Попробую WStrList. А owner draw - это самому отслеживать? Для меня это несложно, но думал уже Вы сделали.

2 - так программа же немного разрослась. Попробуй уследи. Я думал можно там на что-то проверить, какой-нибудь ноль или nil или еще что, тяжело по коду следить. Можно?

P.S. Я задал поиск на "TListView" по каталогу со справкой КОЛ и не получил ни одной ссылки. А Вы же пишете, что самая доступная и свежая справка именно в самом коде КОЛ. Может по  ListView еще нет справки или где она?


 
Vladimir Kladov   (2007-07-02 20:06) [6]

У нас нет TListView, у нас TControl. Ищите listview или list view.


 
domo   (2007-07-04 18:07) [7]

Я попробовал WStrList, но у меня пока не получилось. Метода AnsiSort я там не обнаружил, метода Find - тоже. А что же тогда вместо них?

Теперь про помощь на list view и listview. Да, Вы правы, на эти слова что-то я нашел. Но информация настолько скудная, настолько скудная, что я больше почерпнул из Ваших ответов и особенно ответов Дмитрия К (еще раз спасибо ему за примеры), чем из помощи по КОЛ. Ну не все же такие классные программисты, как Вы (речь даже не про меня), может Вы все-таки расширите эту помощь, чтобы она была полезной для большего числа людей?


 
=BuckLr=   (2007-07-04 19:29) [8]


> Метода AnsiSort я там не обнаружил

.Sort() ??? AnsiSort там не будет, это же юникодовый список


> метода Find - тоже

Можно написать свой, используя Find от pStrList.


>  как проверить, что списки ListView и StrList еще существуют

Ну это же как обычно, что за проблемы?
if Assigned(MyStrList) then ...


> как в списки ListView и StrList читать строки Unicode

Если речь о загрузке из файла, то сейчас погляжу в свои исходнички...


 
=BuckLr=   (2007-07-04 19:54) [9]

Ага, нашёл, только кода много, потому что там не только UTF-8, но и UTF-16 big и low endian и куча ещё чего - всё заточено под чтение юникодовых текстовых файлов. А что тебе нужно - я не знаю.

Ну в общем, если тебе просто сохранить-загрузить что-то своё, то SaveFromFile и LoadFromFile :)

Ну а если Что до справки - тебе дело говорят: KOL.pas вполне хватает...


 
=BuckLr=   (2007-07-04 20:03) [10]

Ага, нашёл, только кода много, потому что там не только UTF-8, но и UTF-16 big и low endian и куча ещё чего - всё заточено под чтение юникодовых текстовых файлов. А что тебе нужно - я не знаю.

Ну в общем, если тебе просто сохранить-загрузить что-то своё, то SaveFromFile и LoadFromFile :)

Ну а если Что до справки - тебе дело говорят: KOL.pas вполне хватает...


 
domo   (2007-07-05 14:42) [11]

Я посмотрел - мой текст UTF-8.
Метод .Sort() попробовал, действительно работает, Find от pStrList прикрутить попробую, но не уверен, что смогу, - иногда бывает проще свой код написать, чем разобраться в чужом. Про if Assigned(MyStrList) then я не догадался. В общем, спасибо.

А про помощь KOL.pas я все-таки не согласен. Мне, н-р, этой помощи мало. Посмотри, что там про listview - крохи. И вообще, чем больше и качаственнее помощь - тем лучше.


 
domo   (2007-07-09 10:17) [12]

Не могу даже попробовать разобраться с методом Find, т.к. никак не могу считать свой файл UTF-8 в вирт.список. Текстовые редакторы UTF-8 читают этот файл нормально, а у меня получается всего одна очень длинная строка (т.е. игнорируются #13#10), причем вся из знаков вопроса. Что-то я не так делаю. А читаю я точно так же как и в обычный список, только pStrList заменил pWStrList. Требуется помощь, подскажите, как надо.


 
=BuckLr=   (2007-07-09 11:20) [13]


> Мне, н-р, этой помощи мало


> Не могу даже попробовать разобраться с методом Find

Ну это уже другой вопрос, когда ты не можешь. Лично я без труда делал и свой сорт, и много ещё чего. Надо просто подумать чуть-чуть.


 
=BuckLr=   (2007-07-09 11:29) [14]


> Требуется помощь, подскажите, как надо.

Ну как тебе подсказать? Ты хоть код бы привёл, а то ж мы почём знаем, что ты там написал? Сложно отвечать на вопросы типа "я хочу это, но у меня не получается, скажите что не так"
Кидай код, короче.


 
domo   (2007-07-09 18:07) [15]

Нет проблем, вот он, шедевр создания вирт. списка UTF8, дающий почему-то одну длинную строку из знаков вопроса. Только код большой, но, как говорится - сам напросился:

interface

   OpenSaveDialog1: TKOLOpenSaveDialog;
   TabControl1: TKOLTabControl;
   TabControl1_Tab0: TKOLPanel;
   TabControl1_Tab1: TKOLPanel;
   Toolbar1: TKOLToolbar;
   Memo1: TKOLMemo;

   procedure ProgStartHere(Sender: PObj);

 private
   { Private declarations }
 public
   { Public declarations }
  procedure lvWOnLVData(Sender: PControl; Idx, SubItem: Integer;
         var Txt: KOL_String; var ImgIdx: Integer; var State: DWORD;
         var Store: Boolean);
  procedure OpenFileForList(ks: KOLString);
 end;

var
 sListW, sListW2: pWStrList;// for UTF
 LvW: PControl;

procedure LVColumnClick(Dummy: Pointer; Sender: PControl; Idx: Integer);

implementation

procedure TForm1.lvWOnLVData(Sender: PControl; Idx, SubItem: Integer;
 var Txt: KOL_String; var ImgIdx: Integer; var State: DWORD; var Store: Boolean);
begin
case SubItem of
 0: Txt:=int2str(Idx+1);
 1: Txt:=sListW.Items[Idx];
end;
end;//lvWOnLVData

procedure TForm1.OpenFileForList(ks: KOLString);
var i,j: integer;

begin//OpenFileForList
sListW.Clear; sListW2.Clear; Memo1.Clear;
  //sListW.SetText(StrLoadFromFile(ks), false); {попробовать еще так}
if sListW.LoadFromFile(ks) then begin{if7}
  //try to remove evrth until [Data] section. Пока не работает
(*i:=0;
 repeat
  Memo1.Text:=Memo1.Text +#13+#10 + sListW.Items[i];
  inc(i);
 until (sListW.Items[i] = "[Data]") or (i = sListW.Count);
 for j:=i-1 downto 0 do sListW.Delete(j);
*)
 LvW.LVCount:=0;
 LvW.Update;
 LvW.LVCount:=sListW.Count;
end{if7}
else Form1.Form.StatusText[1]:="Ошибка при чтении списка из файла!";

end;//OpenFileForList

//========{Старт обработки}======
procedure TForm1.ProgStartHere(Sender: PObj);
var
s: string;

begin
Form1.Form.StatusText[0]:="";
Form1.Form.StatusText[1]:="";
Form1.Form.StatusPanelRightX[0]:=155;
sListW:=NewWStrList;  form.add2autofree(sListW); //list for UTF8 file
sListW2:=NewWStrList; form.add2autofree(sListW2);//try to make undo in ListW2
//Создание списка UTF
LvW:=NewListView(TabControl1.Pages[1], lvsDetail, [lvoRowSelect, lvoGridlines, lvoOwnerData], nil, nil, nil).SetPosition(0,24).SetSize(300,359).SetAlign(caNone){.BringToFront};
LvW.AnchorTop:=true; LvW.AnchorBottom:=true; LvW.AnchorLeft:=true;
LvW.LVColAdd("N стр.", taRight, 45);//Создание 2 колонок
LvW.LVColAdd("Сама строка", taLeft, 255);
LvW.OnLVData:=lvWOnLVData;//на ввод данных
end;//======cтарт обработки ProgStartHere=======

procedure TForm1.ToolbarClicked(Sender: PObj);
var
s: string;
i,j: integer;
kolstr,ks: KOL_string;

begin//ToolbarClicked
if Toolbar1.RightClick then beep (150, 100)
else begin{4}
 case Toolbar1.CurIndex of
  0: begin{c0}
   if OpenSaveDialog1.Execute then begin{if2}//which file to open
     OpenFileForList(OpenSaveDialog1.Filename);//open file in listview
   end{if2} else beep (150, 100);
  end{c0};
  1: if sListW.Count>0 then begin{i5}//save modified file if it"s not empty
      sListW.AppendToFile(ExtractFileNameWOext(OpenSaveDialog1.Filename)+"_new.txt");
     end{i5};
  //...
  20: Form.Close;//21=17 buttons + 4 separators
 end{case Toolbar1.CurIndex};
end{4};
end;//ToolbarClicked

//try to sort listW when column header is clicked. Пока не хочет работать
procedure {TForm1.}LVColumnClick(Dummy : Pointer; Sender: PControl; Idx: Integer);
begin
LvW.LVOptions:=[lvoSortAscending];//иначе не работает
LvW.BeginUpdate;
LvW.LVSortColumn(idx); //sorting for column? Look for more info on that method.
LvW.LVCount:=0;
LvW.Update;
LvW.LVCount:=sListW.Count;
LvW.EndUpdate;
end;


 
Vladimir Kladov   (2007-07-09 19:25) [16]

UTF-8 - это не WideString. Это обычные Ansi-символы, в которой unicode-символы представлены в виде 16-ричных цифр. Метод TWStrList.LoadFrom... предназначен для загрузки именно Unicode, и именно 2х-байтного unicode (есть ещё 4-байтный вариант).

Совет: поищите по KOL.pas строку UTF, может что-то прояснится насчёт загрузки именно UTF.


 
=BuckLr=   (2007-07-10 12:25) [17]

Я бы вообще использовал RichEdit.RE_Text вместе с re_TextUnicode - работает без проблем. А с Memo повозиться придётся


 
mdw ©   (2007-07-10 13:21) [18]

А в чем проблема? есть же функции UTF8xxxxx. Читайте файл и преобразуйте в нужный формат.


 
domo   (2007-07-11 09:54) [19]

Нет, не всё так просто (для меня конечно, для остальных-то, думаю, всё ясно).
Я просмотрел kol.pas, выбрал функцию UTF8_2WideString (более подходящего не нашел), поменял слегка свой код, но - не работает. Строки-то читаются в ListView, но в конце почти каждой строки - мусор из знаков вопроса и крякозябликов. Меня замучили крякозяблики вместо табуляции, а тут еще и эти. А может быть ошибка в функции UTF8_2WideString или где-то не тот тип я использую?

Да, мне же не только в Memo1 надо читать строки (там только комментарии),
основной массив строк - в вирт.списке. Делаю так:
- из файла считываю в pStrList,
- в вирт.список перегоняю lvOnLVData:

procedure TForm1.lvOnLVData(Sender: PControl; Idx, SubItem: Integer;
 var Txt: KOL_String; var ImgIdx: Integer; var State: DWORD; var Store: Boolean);
begin
case SubItem of
 0: Txt:=int2str(Idx+1);
 1: Txt:=UTF8_2WideString(sList.Items[Idx]);
end;
end;//lvOnLVData

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


 
mdw ©   (2007-07-12 11:47) [20]

Даже не в курсе был, что в KOL есть функции для Utf8. Всегда пользовался из System. Правда в Д5 их вроде нет, но в Д7 есть.

Постотрите:
AnsiToUtf8, PUCS4Chars, StringToWideChar, UCS4StringToWideString, UnicodeToUtf8, UTF8Decode, UTF8Encode, Utf8ToAnsi, Utf8ToUnicode, WideCharLenToString, WideCharLenToStrVar, WideCharLenToStrVar, WideCharToString, WideCharToStrVar, WideStringToUCS4String.


 
domo   (2007-07-13 09:11) [21]

А как же я посмотрю, если у меня только Д5?


 
=BuckLr=   (2007-07-13 12:30) [22]


> А как же я посмотрю, если у меня только Д5?

Нету в систем. В КОЛ смотри


 
mdw ©   (2007-07-13 12:47) [23]


> А как же я посмотрю, если у меня только Д5?

Можно всять System из Д7 и выдрать нужное.


 
Дмитрий К ©   (2007-07-13 13:05) [24]


> domo   (11.07.07 09:54) [19]
>
> Нет, не всё так просто (для меня конечно, для остальных-
> то, думаю, всё ясно).
> Я просмотрел kol.pas, выбрал функцию UTF8_2WideString (более
> подходящего не нашел), поменял слегка свой код, но - не
> работает. Строки-то читаются в ListView, но в конце почти
> каждой строки - мусор из знаков вопроса и крякозябликов.
>  Меня замучили крякозяблики вместо табуляции, а тут еще
> и эти. А может быть ошибка в функции UTF8_2WideString или
> где-то не тот тип я использую?
>

Преобразуй при загрузке:

WStrList.SetText(UTF8_2WideString(StrLoadFromFile("файл")));


 
domo   (2007-07-13 14:36) [25]

Увы, WStrList.SetText(UTF8_2WideString(StrLoadFromFile(ks))); не работает: латынь видна, кириллица - крякозябликами, в конце почти каждой строчки с десяток знаков вопроса. Да и Кладов уже мне писал, что "UTF-8 - это не WideString".

А можно к этому форуму прикрепить файл system.pas из Д7? Я бы в нем поковырялся насчет функций про к-рые писал mdw... Или может уже у кого-то есть выдранные?


 
mdw ©   (2007-07-13 14:40) [26]

Куда прислать? или письмо мне напиши, пришлю system.pas. Кстати в kolatl.7z должны быть, я в свое время добавлял для совместимости с Д5.


 
domo   (2007-07-13 15:01) [27]

Ох ты, прошу прощения, работает! Я же поставил и забыл потом снять преобразование UTF8_2WideString с procedure TForm1.lvWOnLVData. Огромное спасибо Дмитрию К.


 
domo   (2007-07-13 15:07) [28]

mdw: Знаешь, все-таки пришли, вдруг я еще что-то захочу преобразовать: dom3me СОБАЧКА yahoo.com


 
domo   (2007-07-13 15:35) [29]

Дмитрию К: А сохранять как, а то sListW.SaveToFile(ExtractFileNameWOext(ks)+"(New).txt"); дает мне файл не UTF, а Unicode.


 
Дмитрий К ©   (2007-07-13 15:50) [30]


> А сохранять как,


Например, использовать функцию UTF8Encode из модуля system.pas из D7


 
mdw ©   (2007-07-13 16:14) [31]

Послал. Там 2 письма, первый раз забыл сам файл прикрепить.:)


 
domo   (2007-07-13 17:03) [32]

mdw: получил, спасибо. Посмотрю на досуге, наверняка что-то пригодится.
Дмитрий К: это непросто для меня, но спасибо, попробую.


 
domo   (2007-07-24 11:14) [33]

Разобрался на досуге с 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, не хочется свою собственную программу кромсать Ресторатором.


 
Demt   (2007-08-04 19:08) [34]

Дабы не плодить лишних тем пишу в эту ветку.
Нужно организовать из 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, и выносится отдельной строкой..
Жду вразумительного ответа


 
Vladimir Kladov   (2007-08-04 21:53) [35]

У нас LVITems[ line, col ]. SubItems нет и не будет.


 
Дмитрий К ©   (2007-08-04 21:55) [36]


> Жду вразумительного ответа
На какой вопрос?

Пример загрузки-сохранения:
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.


 
Demt   (2007-08-05 08:26) [37]

Теперь понял алгоритм, а то что-то в голове вырисовывалось, но не до конца. Про LVItems я знаю, это даже лучше чем в VCL.
Дмитрий К: Спасибо за предоставленный код.


 
Robt   (2007-09-18 15:37) [38]

можно ли через указатели
"за раз" скопировать все итемы из одного в другой листвиев?
точней в первом они создаются а второй к ним "подключается" и все
изменения в первом видны во втором и наоборот


 
Vladimir Kladov ©   (2007-09-18 17:08) [39]

За раз можно и без указателей. Достаточно оба сделать виртуальными и в OnData брать данные из одного и того же места.


 
Robt   (2007-09-18 19:01) [40]

А как оно работает ?



Страницы: 1 2 вся ветка

Текущий архив: 2008.06.15;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.022 c
2-1211463437
StiTch
2008-05-22 17:37
2008.06.15
ComboBox


2-1211401846
ivan8511
2008-05-22 00:30
2008.06.15
Слаживание времени


15-1209629962
Алексин
2008-05-01 12:19
2008.06.15
Wi-Fi в квартире


2-1211459186
Tommy
2008-05-22 16:26
2008.06.15
DBLookupCombobox, postgresql, ADO


2-1211452478
Павел
2008-05-22 14:34
2008.06.15
TStringList; в Дельфи 6 - где объявить?