Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Вниз

Выравнивание колонок ListView по содержимому   Найти похожие ветки 

 
Aleks   (2009-10-26 15:31) [0]

Как выравнять колонки ListView по содержимому? Нашел такой код:
ListView1.SetFocus;
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_ADD, 0, 0, 0);
keybd_event(VK_ADD, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Отлично работает,но не учитывает текст в шапке списка :(
и после автовыравнивания приходится еще и ручно раздвигать колонки чтобы прочитать обрезаный текст в шапке.


 
clickmaker ©   (2009-10-26 15:50) [1]

> но не учитывает текст в шапке списка

значит, самому нужно учесть. см. Canvas.TextWidth


 
Aleks   (2009-10-26 18:19) [2]

Выставлять после заполнения списка ListView данными программно ширину Canvas.TextWidth? Или как? Я не очень понимаю как это можно сделать :(


 
Юрий Зотов ©   (2009-10-26 18:47) [3]

> Aleks   (26.10.09 18:19) [2]

После выполнения Вашего кода пройти в цикле по колонкам, и у тех колонок, где ширина текста в заголовке больше ширины самой колонки, выставить новую ширину колонки.

Но гораздо лучше использовать макрос ListView_SetColumnWidth, а не Ваши археологические раскопки (я в шоке: это ж надо такое придумать - управлять контролом через эмуляцию клавиш).

Описание ListView_SetColumnWidth см. в MSDN, там все очень просто, например:

for i := 0 to ColumnCount -1 do
  ListView_SetColumnWidth(Handle, i, LVSCW_AUTOSIZE_USEHEADER);


 
Aleks   (2009-10-27 10:18) [4]

Спасибо большое! Буду пробывать for i := 0 to ColumnCount -1 do
 ListView_SetColumnWidth(Handle, i, LVSCW_AUTOSIZE_USEHEADER);


 
Aleks   (2009-10-28 17:45) [5]

ListView_SetColumnWidth - неизвестный идентификатор (ошибка компилирования) :(


 
Юрий Зотов ©   (2009-10-28 18:50) [6]

> Aleks   (28.10.09 17:45) [5]

uses ..., CommCtrl;

Не стыдно?


 
Aleks   (2009-10-29 10:46) [7]

Совершенству нет предела.. Бум знать,Спасибо Большое за помощь Юрий!


 
Aleks   (2009-10-29 10:54) [8]

Написал так:
for i := 0 to ListView1.Columns.Count -1 do
ListView_SetColumnWidth(Handle, i, LVSCW_AUTOSIZE_USEHEADER);
Но почему-то все-равно не работает :( Ни хидер не раздвигает по ширине заголовков, ни колонки по ширине содержимого. Вызываю цикл после заполнения списка данными.(юсес прописал)


 
Юрий Зотов ©   (2009-10-29 11:06) [9]

Handle чей передаете? Формы?

Видимо, формы. Вот окно формы эту команду и получает. Теперь вопрос - а как окно формы может ее выполнить, ежели ни о каких колонках оно и понятия не имеет?

Разве не очевидно, что команду должно получить окно ListView? Значит, и передавать нужно ListView1.Handle.

Совершенству, конечно, предела нет. Но думать все равно нужно.


 
Aleks   (2009-10-29 13:58) [10]

Заработало! :) Спасибо Большое Юрий!


 
Юрий Зотов ©   (2009-10-29 14:55) [11]

Что заработало - это хорошо. А что на такую простую вещь было потрачено 3 дня вместо 3-х минут - это никуда не годится. Аж две грубые ошибки... ну как же так? Причем первая (uses) было совершенно очевидной, да и вторая (handle) тоже.


 
Aleks   (2009-10-29 15:15) [12]

У хорошего учителя знающие ученики.. :) (Со временем;) )


 
Aleks   (2009-10-29 15:18) [13]

Нужно из проги запустить TecDoc (http://pslan.com/details.php?id=78220). Указываю путь к нему и запускаю таким методом:
var
 c: array[0..800] of Char;
 path:String;
begin
path:=openDialog1.FileName;
StrPCopy(c, path);
ShellExecute(Application.Handle, "open", c, nil, nil, SW_NORMAL);
end;
В результате несколько окон с ошибками и нулевой результат, с WinEXEC аналогично. Блокнот или плеер вызывает легко,а вот ТекДок никак :( Че делать?


 
Dennis I. Komarov ©   (2009-10-29 15:24) [14]

Плох ученик, который учится не хочет, а ищет халаву. Одной ветки мало?


 
Юрий Зотов ©   (2009-10-29 15:47) [15]

> Aleks   (29.10.09 15:18) [13]

1. Почему массив не packed (хотя он все равно будет packed, но почему не объявлен правильно)?

2. Зачем копировать строку вместо приведения типа (хотя это не ошибка, но это лишняя память и лишние операции)?

3. Почему Application.Handle (хотя это не ошибка, но почему именно так)?

4. Почему передается массив, а не его адрес (а вот это уже ошибка - и, кстати, если бы не было вопроса 2, то не было бы и этой ошибки)?

5. Это расширение имени файла в системе точно зарегистрировано?


 
Aleks   (2009-10-29 16:02) [16]

Код взял тут:http://www.delphisources.ru/pages/faq/base/run_app.html так как сам не знал как запустить файл из Дельфи :(


 
Dennis I. Komarov ©   (2009-10-29 16:20) [17]

Издержки халявы...


 
Aleks   (2009-10-29 16:33) [18]

Издержки незнания :( Научить некому, вот и спрашиваю на форуме. Но видимо и тут не найду помощь.. :(


 
Юрий Зотов ©   (2009-10-29 16:36) [19]

> Aleks   (29.10.09 16:02) [16]

Разобрать чужой код "по винтикам", используя для этого справочные материалы - очень полезно. И MSDN я упоминал именно для этого.

Использовать чужой код бездумно, не понимая, как он работает - очень вредно.

Если Вы не смогли самостоятельно использовать пример с ListView и не смогли ответить на вопросы по поводу открытия файла - значит, в обоих случаях Вы пошли вторым путем. А это уже тенденция.

Что ж, Ваше право. Но без меня.

Жаль.


 
Юрий Зотов ©   (2009-10-29 16:40) [20]

> Aleks   (29.10.09 16:33) [18]

Вы нигде не найдете ни уважения, ни помощи, пока САМИ не начнете РАБОТАТЬ.

Но как только Вы это начнете - Вы найдете помощь и уважение везде. И здесь тоже.


 
Dennis I. Komarov ©   (2009-10-29 16:50) [21]


> Aleks   (29.10.09 16:33) [18]
> Издержки незнания :( Научить некому, вот и спрашиваю на
> форуме. Но видимо и тут не найду помощь.. :(

Как же тебя научить, ты учиться не хочешь?


 
Юрий Зотов ©   (2009-10-29 17:15) [22]

> Aleks   (29.10.09 16:02) [16]

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

В Сети ОЧЕНЬ много примеров кода, которые содержат погрешности, прямые ошибки, утечки памяти и прочие недочеты. Либо пример был писан еще под Win16 - и там был правильным, а под Win32 оказался неверным. Либо пример правильный, но написан не для тех условий, для которых его пытаются использовать без соответствующих доработок - и поэтому он снова превращается в неправильный.

Поэтому любой найденный в Сети код ОБЯЗАТЕЛЬНО нужно досконально проанализировать и понять, как он работает - причем со справкой в руках. Нужно по справке изучить каждую использованную функцию, каждый ее параметр, прочитать замечания по ней - вот это и есть учеба. И только после такого изучения станет ясно, подходит ли данный пример, не содержит ли он ошибок и требует ли он доработки. И вопросы после этого Вы будете задавать уже совсем другие - не "как взлететь на Луну?", а "какой материал лучше использовать для болта номер 7 в ракете номер 4?".

Приведенная Вами ссылка - яркий тому пример. Вы даже представить не можете сколько там погрешностей и прямых ошибок. Море. Они буквально в каждой из 5 приведенных там функций (хотя 5 не нужно, все легко сводится к двум). Лень комментировать, да и комментировать пришлось бы слишком много - просто поверьте на слово, что грязи там действительно много. И, даже не пытаясь разобраться, Вы методом "copy+paste" тащите всю эту грязь в свою программу.

И получается: программа так и не заработала, знаний у Вас так и не прибавилось - пользы, значит, никакой. Зато в программе появилась грязь - значит, вред один только.

А зачем?


 
Aleks   (2009-10-29 18:00) [23]

Я уже все способы перепробовал и ShellExecute и WinExec,ниче не работает :( Любую прогу можно запустить кроме TecDoc,даже параметры никакие при запуске не передаются(смотрел свойства ярлыка на раб.столе). Неужели так трудно привести код в пару строк для запуска внешней проги и обьяснить как работает? Пишу сам себе софт для работы на автосервисе, так как в инете все платное(дорогое) для таких нужд как у нас.


 
Dennis I. Komarov ©   (2009-10-29 18:12) [24]

Aleks   (29.10.09 18:00) [23]
А после на сервис все хором поедим к тебе масло скажем менять. Ну ведь правда, ничего сложного в этом нет? Ну не может доярка управлять страной, так нафига же тебе писать себе программу? В больницу на операцию будите ложиться, а хирург вам: "Да, ща скажут на форуме как тут чего..."


 
Aleks   (2009-10-29 18:23) [25]

Я не механиком у нас работаю,а менеджер-бухгалтер,и с компами давно на "ТЫ" (еще с Басика начинал,потом перешел на Паскаль). Счас пытаюсь Дельфи освоить собственными силами..  А масло можете приехать поменять,сделаю скидку за помощь на форуме. Будем рады Вас видеть! :)


 
Юрий Зотов ©   (2009-10-29 18:23) [26]

> Aleks   (29.10.09 18:00) [23]

> Любую прогу можно запустить кроме TecDoc

А сам факт того, что ShellExecute запускает любую прогу, кроме TecDoc - сам этот факт разве ни о чем не говорит?


 
Aleks   (2009-10-29 18:24) [27]

P.S. Понравилась фраза про больницу,смешно.. :)


 
Aleks   (2009-10-29 18:26) [28]

Вот и мне непонятно почему не запускается,хотел разобратся с Вашей помощью.. Вроде параметры никакие не передаются,судя по ярлыку,а вот ведь незадача.. :(


 
Юрий Зотов ©   (2009-10-29 18:37) [29]

> Aleks   (29.10.09 18:26) [28]

Для того, чтобы ShellExecute открыла файл X.EXT в программе P, нужно, чтобы для файлов с расширением EXT в системе  была зарегистрирована команда OPEN, а в ней указана программа P. Без этого ничего не получится.

В Проводнике сделайте двойной клик левой кнопкой по Вашему файлу. Если при этом TecDoc не запустится, то и ShellExecute ничего не сможет сделать, пока расширение EXT не будет зарегистрировано в системе (правый клик по файлу -> "Открыть с помощью" -> "Выбрать программу").


 
Dennis I. Komarov (htc)   (2009-10-29 22:43) [30]

не смешно, а грустно...
это управляющий-бухгалтер что-ли?


 
Германн ©   (2009-10-30 01:57) [31]


> Dennis I. Komarov (htc)   (29.10.09 22:43) [30]
>
> не смешно, а грустно...

Смирись.


 
Aleks   (2009-10-30 10:52) [32]

>Dennis I. Komarov. 2in1 время нонче такое.. >Юрий Зотов. В проводнике ТecDoc запускается двойным кликом. Это - исполняемый ехе-файл (tof.exe, в ярлыке на раб.столе указан путь(без доп. параметров) и рабочая папка программы)


 
Юрий Зотов ©   (2009-10-30 11:03) [33]

> Aleks   (30.10.09 10:52) [32]

Елы-палы... еще бы исполняемому файлу не запускаться из проводника... разве об этом речь шла?

У Вас в коде в ShellExecute передается OpenDialog.FileName. Это значит, что Вы хотите открыть файл с этим самым FileName с помощью той программы, которая зарегистрирована в системе для файлов такого типа.

Вот по ЭТОМУ файлу и щелкайте, а не по файлу самой программы и не по ее ярлыку. Если откроется двойным щелчком - значит, ошибка в Вашей программе, а если нет - значит, для файлов такого типа никакой программы в системе не зарегистрировано, поэтому ShellExecute и не срабатывает.


 
brother ©   (2009-10-30 11:07) [34]

если я правильно понял, то автор хочет чего-то открыть с помощью ТecDoc? но обламывается... предположу, эта прога не кушает доп параметры...


 
brother ©   (2009-10-30 11:08) [35]

Юрий, догадавыаетесь, что в openDialog1.FileName; находится?
автор, нука покаж, что там лежит?)


 
Юрий Зотов ©   (2009-10-30 11:37) [36]

> brother ©   (30.10.09 11:07) [34]

> предположу, эта прога не кушает доп параметры...

Я тоже это предполагаю. Заодно и оно проверится.


 
Aleks   (2009-10-30 11:50) [37]

> brother. Я так думаю в openDialog1.FileName полный путь с именем файла. А параметры не нужно никакие передавать, просто запустить TecDoc. (Имя tof.exe, в ярлыке на раб.столе указан путь(без доп. параметров) и рабочая папка программы).


 
brother ©   (2009-10-30 11:56) [38]

это даже не ТЗ, ну, ладно... теперь пиши программу...


 
Юрий Зотов ©   (2009-10-30 11:58) [39]

> Aleks   (30.10.09 11:50) [37]

>  Я так думаю в openDialog1.FileName полный путь с именем файла.

Здесь не надо думать - надо поставить точку останова и отладчиком посмотреть, что там в этом FileName сидит. Конкретно и без всяких раздумий. И отписать сюда.

И еще: уточните, что Вы хотите сделать - просто запустить tof.exe, или запустить так, чтобы в нем сразу оказался открытым какой-то документ (файл)?


 
Aleks   (2009-10-30 12:05) [40]

openDialog1.FileName=E:\TECDOC_CD\3_2009\pb\tof.exe  Нужно просто запустить, открыть ничего в нем не удастся. В идеале надо открыть указанную в проге запчасть в каталоге,но я пробовал передать параметры bat-ником (tof.exe код запчасти),-безрезультатно :(


 
Юрий Зотов ©   (2009-10-30 12:13) [41]

О, боже... ну наконец-то.

WinExec(PChar(OpenDialog1.FileName), SW_NORMAL);

PS
Не нужен Вам никакой OpenDialog. Пропишите путь к tof.exe в файле настроек Вашей программы и читайте его оттуда. Незачем заставлять юзера каждый раз одни те же кнопки тыркать.


 
Юрий Зотов ©   (2009-10-30 12:17) [42]

Добавление: у Вас строка запуска не содержит пробелов, но если они есть, то при передаче WinExec эту строку надо взять в двойные кавычки.


 
Aleks   (2009-10-30 12:49) [43]

> Юрий Зотов. OpenDialog единожды использую для выбора пути к файлу TecDoc в настройках программы, потом он записывается в реестр и читается при вызове комманды контекстного меню списка запчастей. Попробую WinExec(PChar(OpenDialog1.FileName), SW_NORMAL) и отпишусь.. Спасибо за поддержку!


 
Aleks   (2009-10-30 12:54) [44]

Не работает WinExec(PChar(OpenDialog1.FileName), SW_NORMAL); Окно ошибки: Reading Errormessages failed. Errorcode= -2. Could not load Errormessages :( Predefined Message "ISB-00001" not found (да\нет\отмена). Так же как и с ShellExecute :(


 
Юрий Зотов ©   (2009-10-30 13:22) [45]

Фантастика какая-то. Попробуйте так:

// S - это строка запуска TecDoc (E:\TECDOC_CD\3_2009\pb\tof.exe)

if not SetCurrentDir(ExtractFileDir(Trunc(S))) then
 raise Exception.Create("Невозможно установить стартовый каталог");
WinExec(PChar(""" + Trunc(S) + """), SW_NORMAL);


 
Aleks   (2009-10-30 13:30) [46]

Попробую и отпишусь.. Спасибо Юрий!


 
Aleks   (2009-10-30 13:47) [47]

Ошибка компиляции,несовместимость типов: Trunc(S). Trunc разве не с числами работает, отделяет дробную часть?


 
Юрий Зотов ©   (2009-10-30 13:52) [48]

Trim, а не Trunc, конечно.

Блин... чертова Java...


 
Dennis I. Komarov ©   (2009-10-30 14:11) [49]


> Aleks   (30.10.09 10:52) [32]

Отговорки...


> OpenDialog единожды использую для выбора пути к файлу TecDoc
> в настройках программы,

Для этого есть SelectDirectory


 
Aleks   (2009-10-30 15:17) [50]

>Dennis I. Komarov. SelectDirectory как использовать? Можно код?
> Юрий Зотов. ПопробуюTrim..


 
Dennis I. Komarov ©   (2009-10-30 15:21) [51]


> Aleks   (30.10.09 15:17) [50]

опять 25...

F1 не проще нажать или это проверка терпения?


 
Aleks   (2009-10-30 15:21) [52]

> Юрий Зотов. С тримом заработало! :) В чем секрет можете обьяснить? Буду оч.благодарен...


 
Dennis I. Komarov ©   (2009-10-30 15:23) [53]

подскажу лишь, что он не один...


> В чем секрет можете обьяснить?

в пробелах...


 
Aleks   (2009-10-30 15:25) [54]

>Dennis I. Komarov. Ясно, сам разберусь..
> Юрий Зотов. Откуда взялись пробелы в начале и конце в OpenDialog.FileName?


 
Aleks   (2009-10-30 15:26) [55]

>Dennis I. Komarov. Нравятся загадки? ;) Или просто отвечать не любите?


 
Dennis I. Komarov ©   (2009-10-30 15:31) [56]


> Aleks   (30.10.09 15:26) [55]

Хочу научить юзать справку, оно полезно будет

> Aleks   (30.10.09 15:25) [54]

Оно и без трима должно прекрасно работать...


 
Aleks   (2009-10-30 15:33) [57]

>Dennis I. Komarov. А вот не работало, стал бы я создавать тут тему и всем надоедать. Писал бы себе дальше прогу(еще процентов 25 предстоит)...


 
Aleks   (2009-10-30 15:35) [58]

>Dennis I. Komarov. P.S. И сдается мне что Гугль полезнее справки..


 
Dennis I. Komarov ©   (2009-10-30 15:42) [59]

Ну так посмотри что делает трим, и, как следствие, откуда пробелы берутся.

> Aleks   (30.10.09 15:35) [58]

Флаг в руки...


 
Dennis I. Komarov ©   (2009-10-30 15:46) [60]

[16] тоже там нашел...


 
Юрий Зотов ©   (2009-10-30 17:47) [61]

> Aleks   (30.10.09 15:21) [52]

Скорее всего, дело не в триме, я его просто на всякий случай вставил (кто его знает, что там с FileName у Вас присходит, вдруг к нему ерунда какая-нибудь дописывается?).

Меня смутило сообщение об ошибке - какое-то оно "несистемное" (да и код -2 функция WinExec выдать не может, если верить ее описанию). Поэтому я предположил, что WinExec срабатывает нормально и TecDoc успешно запускает, а ошибку выдает уже сам TecDoc и тут же завершается (а с виду получается, что он, вроде бы, и не запускался вовсе, хотя это не так).

Косвенным подтвержением такого предположения стал текст "ISB-00001 not found" в сообщении - я набрал ISB-001 в гугле и стало ясно, что к WinExec он уж точно никаким боком не относится, а вот к TecDoc - может быть (я просто не знаю этой программы, но не исключено).

Тогда возник следующий вопрос - почему при клике по ярлыку TecDoc запускается нормально, а при программном запуске кричит, что он чего-то там "not found"? В чем разница? Вы сказали, что никаких параметров запуска в ярлыке не прописано - значит, разница только в стартовом каталоге. При запуске ярлыком стартовый каталог - это собственный каталог TecDoc, а при запуске из программы стартовый каталог - это текущий каталог программы, если явно не указан никакой другой. И запросто может быть, что при запуске не из своего каталога TecDoc действительно не может чего-то там найти (неграмотно написан, кстати).

Проверка простая - перед запуском TecDoc сменить текущий калог и на собственный каталог TecDoc и посмотреть, что произойдет. И правда произошло - оно возьми, да и заработай.

А трим - это уже так, для страховки. Если никаких фокусов Вы с FileName не вытворяете, то трим можно убрать, должно и без него работать.


 
Юрий Зотов ©   (2009-10-30 17:54) [62]

> Aleks   (30.10.09 15:35) [58]

> И сдается мне что Гугль полезнее справки..

Это САМАЯ грубая ошибка, какую только можно себе представить.

Гугль становится полезным после того, как справку знаешь уже чуть ли не наизусть. А при незнании справки гугль гораздо более вреден, чем полезен.

Знаете, сколько новичков на этом обжигалось? Только на одном этом форуме их были многие сотни (если не тысячи). Кстати, и Вы тоже (см. 22).


 
Юрий Зотов ©   (2009-10-30 18:02) [63]

Для двоичных программистов:

Я в курсе, что при запуске ярлыком стартовый каталог в этом же ярлыке и прописывается.

Но я также в курсе и того, что с вероятностью "много-много девяток" он прописан, как собственный каталог программы. Потому что по дефолту он именно такой, а меняют дефолт лишь очень редкие эстеты.

Эстеты - это, знаете ли, вообще редкость...


 
Aleks   (2009-10-30 18:09) [64]

> Юрий Зотов. Спасибо за подробное описание,очень рад получить помощь от толкового специалиста. Впредь буду знать нюансы запуска внешних программ. А еще понравилась фраза: "Эстеты - это, знаете ли, вообще редкость..." :)


 
Германн ©   (2009-10-30 18:41) [65]


> А еще понравилась фраза: "Эстеты - это, знаете ли, вообще
> редкость..."

Она понравится ещё больше, если прочитаешь бессмертное произведение Я.Гашека
:)


 
Inovet ©   (2009-10-30 19:15) [66]

> [45] Юрий Зотов ©   (30.10.09 13:22)

А WinExec для упрощения примера?


 
Юрий Зотов ©   (2009-10-30 19:45) [67]

> Inovet ©   (30.10.09 19:15) [66]

Угу. Оно, конечно, уже давно deprecated, зато самое простое.

И, впрочем, песня не о нем, а...
:o)


 
Юрий Зотов ©   (2009-10-30 20:09) [68]

А вообще, я лопух. Уже в [44] после слов "окно ошибки" надо было сразу сообразить, что WinExec никаких окон не выдает и, значит, ни при чем.

Хотя кто его знает, чем там этот WinExec был в коде обернут...


 
recop ©   (2009-12-07 17:28) [69]

Господа, а как можно выровнять колонку по содержимому в стиле  vsList?



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

Форум: "Начинающим";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.64 MB
Время: 0.008 c
2-1256560287
Aleks
2009-10-26 15:31
2010.01.31
Выравнивание колонок ListView по содержимому


4-1227702513
dmitry_12_08_73
2008-11-26 15:28
2010.01.31
Приветствую, как определить, пересекаются ли два прямоугольника


15-1259098216
Юрий
2009-11-25 00:30
2010.01.31
С днем рождения ! 25 ноября 2009 среда


15-1259172371
Footballer
2009-11-25 21:06
2010.01.31
Угадай мелодию :)


2-1260185234
Гипербореец
2009-12-07 14:27
2010.01.31
TDBGrid и логические поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский