Вот, сделал, см несколько мессаг ниже (при весьма существенной помощи Димониуса) себе будильник, а то есть привычка о чем-нибудь забывать (да и жизнь заставила вспомнить о Delphi, с которой не сталкивался уже 2 года и работе с которой в институте так толком и не научили).
Уж не знаю многим ли нужны подобные программы, но если кому нужны, то пожалуйста, замечания и предложения.
И две большие просьбы:
1) Если кто-нибудь может поделиться подходящей к программке иконкой буду признателен, у себя я ничего такого не нашел, а рисовать я совершенно не умею.
2) Посоветуйте, какую-нибудь файловую помойку с которой и качается хорошо и файлы надежно лежат. На narod и ему подобных нет никакого желания. Но сегодня за полчаса поисков ничего не нашел.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
CYBERLION Лев Сообщений: 360 Город: Ekb 09.07.2005 08:17
Программа запускается за границей экрана (у меня 800x600). Поставь у формы Position не Designed, а ScreenCenter (пишу по памяти, там разберешься). ;)
При нажатии на иконку в трее левой кнопкой мыши принято восстанавливаться – так делает 99% программ. Остальные восстанавливаются при двойном щелчке. У тебя приходится выбирать из меню "восстановить".
Не имеющие смысла пункты меню принято отключать. Таковыми являются "Восстановить" для развернутого окна и "свернуть" для свернутого.
Спискок... Стиль как у Димониуса в Renamer'е – свой собственный "язык". :) Для пользователей это не очень удобно, пиши по-русски, что за пункт и какие опции. И зачем там сокращения?
Форма не растягивается. Спрашивается: почему? И зачем отключено разворачивание?
Правилом хорошего тона считается отсутствие выполняемых пунктов меню на первом уровне. Это касается пункта "настройки". Лучше разместить его в виде Настроки – Настройки. А вообще, лучше еще одну кнопку добавить, благо места много.
Справка – Помощь. Зачем это сообщение? Нельзя просто открыть текстовый файл?
Дизайн. Три кнопки лежат где-то сбоку... хоть бы по центру сделал, тем более форма неизменяемого размера. И даже если изменяемого, все равно лучше разместить в центре (для простоты можешь кинуть на панель а в форме на OnResize перемещать панель в центр – одна строчка кода).
Не отслеживается повторный запуск программы. Думаю, они еще и конфликтовать будут, не проверял.
Выдаваемое сообщение может сопровождаться всплыванием программы поверх остальных окон
Звук издала, но не выползла (сидела в трее). Ты используешь что-нибудь специальное, чтобы вылезать поверх всех? Есть недокументированная (хотя, кажется, ее уже документировали...) функция вроде SwitchToThisWindow – почти единственный способ заставить винду показать окно, если активно окно другого процесса (другой способ – позволить так делать всем процессам, но это свинство по отношению к пользователю ;) ). Другие способы могут привести максимум к миганию кнопки приложения на панели задач.
Все ваши настройки храняться в рабочей папке программы.
Уважаю. :)
- Кнопка "Править список сообщений" пока не будет работать в Windows 9x, поскольку путь к "Блокноту" намертво прописан в файле config.ini из папки программы. У Windows 9x этот путь не C:\Windows\system32\notepad.exe, а C:\Windows\notepad.exe. Можете исправить, или заменить на любой другой редактор.
Лечится вот так: "EditorPath=notepad.exe". Блокнот испокон веку в AppPaths в Реестре прописан, так что запустится безо всяких путей.
Если кто-нибудь может поделиться подходящей к программке иконкой
Сейчас попытаюсь найти что-ниюудь будильнико-образное. Для иконок Resource Hacker рекомендую, к слову. ;)
Программа запускается за границей экрана (у меня 800x600). Поставь у формы Position не Designed, а ScreenCenter (пишу по памяти, там разберешься).
Мдя... При дизайне форма и так находилась почти по центру. Исправлено.
При нажатии на иконку в трее левой кнопкой мыши принято восстанавливаться – так делает 99% программ. Остальные восстанавливаются при двойном щелчке. У тебя приходится выбирать из меню "восстановить".
Пока писал ответ исправил, повесил на двойной.
Не имеющие смысла пункты меню принято отключать. Таковыми являются "Восстановить" для развернутого окна и "свернуть" для свернутого.
Пока не получилось поправить сразу. Странно, почему-то даже при сворачивании трассировщик показывает, что Application.MainForm.WindowState=wsNormal.
Спискок... Стиль как у Димониуса в Renamer'е – свой собственный "язык". Для пользователей это не очень удобно, пиши по-русски, что за пункт и какие опции. И зачем там сокращения?
Не нравятся ключи -p, -s? Я их поставил не от хорошей жизни, хотелось поменьше места выделять под служебную информацию. Здесь, наверное надо вместо ListBox'а использовать ListView.
Форма не растягивается. Спрашивается: почему? И зачем отключено разворачивание?
По моим эстетическим соображениям. По идее, если сделать разворачиваемость, то кнопки надо убрать, и сделать панель инструментов. А список AllClient и не надо будет ничего пересчитывать при изменении размеров.
Звук издала, но не выползла (сидела в трее). Ты используешь что-нибудь специальное, чтобы вылезать поверх всех? Есть недокументированная (хотя, кажется, ее уже документировали...) функция вроде SwitchToThisWindow – почти единственный способ заставить винду показать окно, если активно окно другого процесса (другой способ – позволить так делать всем процессам, но это свинство по отношению к пользователю ). Другие способы могут привести максимум к миганию кнопки приложения на панели задач.
А вот здесь поподробнее. Сейчас там:
form1.Show;
SetForegroundWindow(Form1.Handle);
SetActiveWindow(Form1.Handle);
И потом ShowMessage.
Само окно не всплывает, но сообщение появляется, что на мой взгляд достаточно.
Димониус поделился прикольной компонентой WindowList, которая строит список окон и их свойств. Можно послать всем видимым сообщение свернуться, но я в итоге решил так не делать по трем причинам:
1) А зачем сворачивать, когда достаточно показать сообщенье?
2) Сворачивание с анимацией слишком долго.
3) А зачем так сложно, если на вышеприведенном мной глюков не замечено.
Все ваши настройки храняться в рабочей папке программы.
Уважаю.
Я считаю извращением как писать, что-то в реестр, когда можно обойтись ini-файлом, так и писать ini-файлы в системные папки, как оно делается, если полениться указать полный путь.
Лечится вот так: "EditorPath=notepad.exe".
Исправил.
Иконку заменил на твою.
Кстати, ни у кого нет более красивого названия?
[Добавлено 09.07.2005 15:36:00]:
Дим, неплохо бы, чтобы поле аттача при правке мессаги появлялось всегда, а не только, когда аттач присутствует
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
И все-таки лучше одинарный. Если нет причин делать иначе.
Странно, почему-то даже при сворачивании трассировщик показывает, что Application.MainForm.WindowState=wsNormal.
При сворачивании в трей тебе надо проверять, видимо ли окно. Ты же его скрываешь, а не сворачиваешь, чисто технически. Хотя, может, и сворачиваешь тоже, не знаю.
Здесь, наверное надо вместо ListBox'а использовать ListView.
Неплохая идея: так можно будет сортировать, например. Зачем в ListBox'е эти ключи? У тебя же все в своих структурах хранится (или нет?). Пользователю нужны ясные описания.
По моим эстетическим соображениям.
А если по моим эстетическим соображениям я хочу добавить большое сообщение и оно не помещается? ;)
Само окно не всплывает, но сообщение появляется, что на мой взгляд достаточно.
А если я не хочу звук, а хочу сообщение? А программа будет сидать в трее и молчать, ожидая, что ее восстановят. Очень удобно и практично. ;)
Можно послать всем видимым сообщение свернуться
А просто-напросто сделать свое окно активным религия не позволяет? ;)
решил так не делать по трем причинам
4) Пользователь удалит программу, когда все его окна свернутся ни с того, ни с сего. ;)
А зачем так сложно, если на вышеприведенном мной глюков не замечено.
Кроме одного – пользователь не видит сообщения. ;)
Beltar писал: form1.Show;
SetForegroundWindow(Form1.Handle);
SetActiveWindow(Form1.Handle);
И потом ShowMessage.
Видимо что-то не так делаешь. Это должно показать форму 100%. Я бы сделал свое окно (Form5), создавал его и выводил на передний план, вместо ShowMessage. Во первых его можно будет оформить как угодно, во вторых им намного проще управлять, - ибо ShowMessage в свернутом окне тоже свернут, что совершенно не подходит. И, кстати Application.MainForm.WindowState=wsNormal совершенно верно. Ибо ты сворачиваешь не Form1 а Application! то есть Application - это тоже окно. Может его и не видно, но оно есть и именно оно рулит твоими дочерними окнами, одно из которых Form1. Если хочешь - можешь на него посмотреть:
ShowWindow(Application.Handle, SW_SHOW);
А потом SetWindowPos поставить ему нужные размеры ;)
Чтобы восстановить аппликейшен надо:
ShowWindow(Application.Handle, SW_SHOW);
Application.Restore;
Application.BringToFront;
И вообще хорошо почитать про реализацию взаимодействия форм в дельфятнике - там достаточно своеобразно все сделано.
ListBox'а использовать ListView.
Не очень хорошая идея. Кстати у тебя какой дельфи? А то в 2-6 в XP проблемы с ListView в режиме wsReport - при отрисовке каждой колонки выпадает окно с ошибкой... Не очень красиво ;) Лечится перекомпиляцией стандартного пакета дельфи (из исходников - там несколкьо компонент).
Я бы на твоем месте просто перекрыл отрисовку ListBox - то есть Style: lbOwnerDrawFixed, и прописываешь OnDrawItem.... Типа:
With Control as TListBox do begin //Только так!
//Смотрим если строка выделена, то один цвет if odSelected in State then begin
Canvas.Pen.Color:=clWhite;
Canvas.Font.Color:=clHighlightText;
end else begin
//если нет - другой Canvas.Pen.Color:=clBlack;
Canvas.Font.Color:=clWindowText
end;
Canvas.FillRect(Rect);
//Рисуем текст, у меня - тот же что и в итеме.
//Ты можешь тут любой делать, на основе
//содержимого Item'а Canvas.TextOut(Rect.Left+ItemHeight+1, Rect.Top+2, Items[Index]);
//А тут рисуется цветной квадратик
//(это пример из библиотеки цветов - цвет и описание) Canvas.Brush.Color:=StringToColor(l[Index]);
Мне исходник выложить? Кстати, с динамическим созданием форм тоже ничего не вышло, я исправил, как ты сказал, но все равно ассес виолейшен, причем в весьма странном месте. Уже после того, как форма создана повторно и на нее уже кое-что скопировано.
И, кстати Application.MainForm.WindowState=wsNormal совершенно верно. Ибо ты сворачиваешь не Form1 а Application! то есть Application - это тоже окно.
И как тогда проверять состояние программы?
И вообще хорошо почитать про реализацию взаимодействия форм в дельфятнике - там достаточно своеобразно все сделано.
Перевода хелпа, случайно не существует? Х)
Не очень хорошая идея. Кстати у тебя какой дельфи? А то в 2-6 в XP проблемы с ListView в режиме wsReport - при отрисовке каждой колонки выпадает окно с ошибкой... Не очень красиво
Delphi 6.0 Build 6.190 Update Pack 1. На 7-ой или 8-ой переходить смысл есть? Я вчера разбирался с этим компонетом, в первую очередь с vsReport (все-таки как с ним работать неочевидно), проблем не заметил, или ты имеешь ввиду свою прорисовку?
У ListView главное преимущество, регулируемая ширина столбцов или можно сделать то же самое многоколонным листбоксом? Есть еще таблица, с которой все легко и просто но у нее столбцы не раздвигаются.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Dimonius леффка Сообщений: 10303 Город: Москва 10.07.2005 17:47
Beltar писал:И как тогда проверять состояние программы?
хотя бы по Form1.Visible...
Кстати, с динамическим созданием форм тоже ничего не вышло, я исправил, как ты сказал, но все равно ассес виолейшен, причем в весьма странном месте.
А ты уверен, что проблема имеенно в форме, а не в тех данных что ты пытаешься в нее скопировать? Может Task твой уже разрушается во время его копирования или еще что?
Delphi 6.0 Build 6.190 Update Pack 1. На 7-ой или 8-ой переходить смысл есть?
Да по моему нет. Я вообще на 4 и на 6 пишу... Правда эти ошибки я исправил таки. Просто попробуй подложить файл манифеста (чтобы программа начала использовать стили winXP) к своей программе и посмотреть как он абудет падать ;) Точнее будет работать но постояно сообщать о ошибках.
У него есть плюсы, но все таки в целом это достаточно большой и сложный компонент. Лично я стараюсь пользоваться другими. Есть еще VirtualStringList.... это самопал, много умеет.
(все-таки как с ним работать неочевидно)
А что там неочевидного? первая колонка - это Item.Caption. Далее - Item.Substring[] - там это TStringList, такой же как и в TListBox
Есть еще таблица, с которой все легко и просто но у нее столбцы не раздвигаются.
Как это не раздвигаются? А почему у остальных раздвигаются? а в Table.Options пробовал добавить "change width of row"? Не помню как оно там точно сформулировано?
2 Athari просто при вставке стилей XP в свои программы на самом деле происходит подмена библиотеки компонентов для программы. В новой библеотеке часть вещей была удалена, за "не надобностью". В том числе часть проверок. В итоге стали проявляться определенные ошибки:
Копируем comctrls.pas в папку LIB, исправляем там процедуру TCustomListView.UpdateColumn и TListColumn.Create.
Заменить
mask:=LVCF_TEXT or LVCF_FMT or LVCF_IMAGE;
iImage:=FImageIndex;
на
mask:=LVCF_TEXT or LVCF_FMT;
if FImageIndex >= 0 then mask := mask or LVCF_IMAGE;
iImage:=FImageIndex;
Компилируем люьой проект с TListView на форме (Pas скомпилируется и заменит старую DCU, почле чего pas файл можно из папки lib убрать)
А ты уверен, что проблема имеенно в форме, а не в тех данных что ты пытаешься в нее скопировать? Может Task твой уже разрушается во время его копирования или еще что?
procedure TForm1.mmSettingsClick(Sender: TObject);
var Hour, Min,Sec, milliSec:Word;
begin
if not assigned(form3) then Form3:=TForm3.Create(self);//создаем форму
with form3 do begin
Edit1.Text:=PathToSound;//начинаем копировать в нее
DecodeTime(LaterTime,Hour,Min,Sec,milliSec);
seHours.Value:=Hour;//здесь вылет
seMin.Value:=Min;
CheckBox1.Checked:=RemoveLater;
cboxTaskBar.Checked:=ShowOnTaskBar;
cboxTray.Checked:=RxTI.Active;
ShowModal;//показываем
If ModalResult=mrOK then
begin //обрабатываем закрытие
try
If not FileExists('Config.ini') then FileCreate('Config.ini');
IniFile.WriteString('UserDef','PathToSound',Edit1.Text);
IniFile.WriteInteger('UserDef','Hours',seHours.value);
IniFile.WriteInteger('UserDef','Minutes',seMin.value);
IniFile.WriteBool('UserDef','RemoveLater',CheckBox1.Checked);
IniFile.WriteBool('UserDef','ShowOnTaskBar',cboxTaskBar.Checked);
IniFile.WriteBool('UserDef','ShowInTray',cboxTray.Checked);
LaterTime:=EncodeTime(seHours.Value,seMin.Value,0,0);
PathToSound:=Edit1.Text;
RemoveLater:=CheckBox1.Checked;
ShowOnTaskBar:=cboxTaskBar.Checked;
pmShowApp.Checked:=ShowOnTaskBar;
RxTI.Active:=cboxTray.Checked;
pmShowIcon.Checked:=RxTI.Active;
If ShowOnTaskBar then ShowWindow(Application.Handle,SW_SHOW)
else ShowWindow(Application.Handle,SW_HIDE);
except
raise Exception.Create('Не могу сохранить настройки.');
end;
end;
end;
form3.Destroy;//уничтожаем. Если это убрать, то все работает.
end;
Как это не раздвигаются? А почему у остальных раздвигаются? а в Table.Options пробовал добавить "change width of row"? Не помню как оно там точно сформулировано?
Проглядел. А называется goRowSizing, goColSizing. В принципе тогда ее можно использовать.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
MAMA Zмея Сообщений: 1532 Город: Москва 10.07.2005 23:53
И вообще, какой смысл создавать и удалять формы в таком простом приложении. Все равно откушивает оперативку неплохо так :)(можно было бы и оптимизировать) По-моему динамика форм тут не нужна.
Dimonius леффка Сообщений: 10303 Город: Москва 11.07.2005 00:13
2 MAMA динамика форм позовляет добится экономии - так у тебя форма сразу в памяти а так только когда нужна. Плюс скорость - формы лишние не создаются.
2 Beltar Мама прав - надо использовать Free. Я же присылал тебе пример на почту - почему ты его не стал использовать? Там как раз было как правильно делать создание и разрушение. Ты же сделал не правильно и первое и второе, и потом удивляешься почему оно не работает
Beltar Смотрю я на вас и думаю... Сообщений: 3251 Город: 11.07.2005 00:58
2 Dimonius Первое, создание как раз как ты сказал. А вообще пробовал и так и этак.
Везде то же самое. Можно и на onClose повесить Action:=caFree; как ты говорил. Уверен потом все равно вызовется destroy или free.
Везде один хрен выходит.
Сейчас посмотрим, что на delphikingdom скажут.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Dimonius леффка Сообщений: 10303 Город: Москва 11.07.2005 13:00
Видимо что-то не так делаешь. Это должно показать форму 100%
Только, если она не свернута, т. е. надо или высмеянное:
Application.Minimize;
Application.Restore;
Или цивилизовано определить, что приложение свернуто и только тогда сделать ему Restore.
Думаю тогда исчезнет и подмеченный Athari плавающий глюк с невсплыванием при некоторых условиях.
Это только одно из многих вызовов при разрушении. Free - это так сказать полное уничтожение
Но окончательный деструктор, все равно Destroy, а вот насчет полного уничтожения на www.delphikingdom.com/asp/answer.asp?IDAnswer=33480 узнал много нового и интересного, ну и как лечить удава, т. е. прогу тоже.
можно из этих выбрать и я пришлю файл или можешь сам в ICO формат переконвертировать, если есть редактор.
Как я полагаю инсталлы редакторов для ico-файлов весят не более 2-3 метров. Дай-ка лучше пару тройку названий, поищу где можно их скачать.
2 MAMA
Все равно откушивает оперативку неплохо так :)(можно было бы и оптимизировать) По-моему динамика форм тут не нужна.
Димыч уже кое-что объяснял по этому поводу. Динамика большого выигрыша, конечно, не даст. Но кое-что все-таки есть, кроме того, а если все красиво оформить, то он должен увеличиться.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Dimonius леффка Сообщений: 10303 Город: Москва 12.07.2005 09:58
Beltar писал:узнал много нового и интересного, ну и как лечить удава, т. е. прогу тоже.
Стандартная практика обнуления указателей. Если будешь работать с интерфейсами и COM'ом там еще интереснее и такого типа водводных камней гораздо больше
Beltar писал:Дай-ка лучше пару тройку названий, поищу где можно их скачать
Ну я пользуюсь Microangelo. А вообще на nnm.ru неделю назад где-то пролетал еще один мощный редактор для иконок. Ну и в конце концов - Гугл знает все!
Beltar Смотрю я на вас и думаю... Сообщений: 3251 Город: 13.07.2005 01:00
Интересная малая прога,скачал,но не проверял.
Микроанжело хорошая прога,уже изучил и работал с ней,иконки и курсоры делать особо не сложно,похоже на Пеинт,только размеры меньше.Там даже анимаццию можно приделать в приложении,если нужно.
Кстати кто-нибудь знаком с библиотекой KOL для Delphi? По-моему классная вещь. Правда переучиваться ой как неохота.
[Добавлено 25.11.2005 11:33:05]:
У меня есть простенькая прога. Работает как айсикью, только намного более упрощенная. Сделана как чат. Клиент весит 163 кб, сервер - 200 кб. Работает прекрасно, при условии, что у сервера есть внешний айпи, либо по локалке. Правда она не доделана до полноценного продукта, но работает нормально :)
Выкладывать не стал, потому что название нецензурное.
Изначально сделал чтобы подурачиться, а исправить забыл.
Beltar Смотрю я на вас и думаю... Сообщений: 3251 Город: 25.11.2005 12:12
2 Beltar Честно говоря эта библиотека меня удивила. Я уж думал, что знаю Делфи хорошо.
Кодоэкономичная библиотека позволяет писать
МАКСИМАЛЬНО оптимизированные приложения.
Например пустое окно будет весить всего 8 кб!
Я видел семплы, среди них - полноценный медиаплеер весом 30 кб. А айсикью-образная прога весит около 30 кб.
Как это осуществляется, почитай на сайте автора.
bonanzas.rinet.ru
Вот почему я скептически отношусь к освобождению памяти от форм в Делфи - потому что это все далеко не оптимизация, а так , потуги :)
[Добавлено 25.11.2005 12:36:48]:
Разумеется эти семплы оптимизированы полностью, то есть в них нет скин интерфейсов, даже иконок нет - чтобы добиться такого крошечного размера.
Разбираться очень лень и нет времени, но надеюсь, скоро все-таки займусь этим. Всего, на что меня хватило - написать самостоятельно пустое окно с парой компонентов (только КОЛ без МСК), почитай, и поймешь , о чем я.
Dimonius леффка Сообщений: 10303 Город: Москва 25.11.2005 12:46
2 MAMA я знаком. Всякую мелоч на ней пишу. Правда лучше еще MSK к ней поставить - чтобы поудобнее было редактировать все. Ну и проблема в том, что она не ООП, а просто ОП - то есть объектная модель, а не наследуемая. Из за наследования и получаются такие большие программы в VCL - ибо носим с собой весь мусор, который никогда и использовать не будем, но компиляор то этого не знает. Кстати по оперативке VCL тоже неплох. Ну при использовании прямых рук. Ну и писать на VCL намного быстрее и удобнее, чем тра.аться с переводом проекта на KOL. Тем более там многих компонент нет, а писать самому - достаточно гиморойно.
2 Beltar Winsock напрямую??? А зачем? Проше компонентик-обвязку минимальную. Тот же TNMClientSocket избавляет от половины гимороя
KOL - Kode Object Library - замена VCL всего. Все написано на ассемблере и максимально оптимизщировано. Правда есть проблема - все компоненты в коде создавать и размещать надо ручками :/ Дизайнера форм и прочего в нем нет
MSK - Mirror что-то там - "шаблончики" компонентов, + мастер настройки для основного Form Editor'а дельфи. правда чтобы им редактировать надо сначала преобразовать проект в KOL Application. Ну и потом поставить Kol Form и уже а нем все править ;) Гимор лишний, зато после преобразвания как с обычным VCL работаешь. Правда в коде обязательно Self надо дописывать.
Форум pridelands.ru >> Творчество любителей Delphi, C++, HTML, PHP и др.