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 не выделялись правой кнопкой мыши ?


mdw   (2007-07-12 11:47:00) [21]

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

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


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

Нет, не всё так просто (для меня конечно, для остальных-то, думаю, всё ясно).
Я просмотрел 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-10 13:21:00) [23]

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


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

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


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

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

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


domo   (2007-07-09 18:07:00) [26]

Нет проблем, вот он, шедевр создания вирт. списка 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;


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


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

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


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


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


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

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


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

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


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

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

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


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

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

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

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


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

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

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

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


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


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

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


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

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


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

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


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

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


domo   (2007-07-04 18:07:00) [34]

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

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


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

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


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

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

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

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


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

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

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


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

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

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

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

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


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

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


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

Хм. Вы программист? 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;


Страницы:   1 2

Наверх

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