Форум: "KOL";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.008 c