Вопрос № 39710: Здравствуйте уважаемые эксперты! Попытался недавно сделать программку, которая бы отсылала информацию на сервер методом POST. Не получилось. Нашёл пример (он в приложении), но при отладке он выдаёт "Invalid variant type". (ошибка происходит...Вопрос № 39727: Как сделать окно "О программе" в стиле Windows (как, например, у игры Сапёр)?...Вопрос № 39746: Здравствуйте.
Есть проблема объясните в чём у меня ошибка. Код компилируется нормально, но после открытия OpenDialog’a и выбора нескольких файлов выдаётся ошибка, что-то вроде Abstract Error. Вот этот код:
procedure TForm1.Button1Click(Sender...Вопрос № 39760: Кто-нибудь знает, как через Delphi сжимать (ну и восстанавливать неплохо бы) M$ Access БД? Суть проблемы: прога (юзает Access-таблицу, формат 2000) отработала, закрывается, самое время сжать. Установка в самом Access'е галочки "сжимать при закры...Вопрос № 39762: Здраствуйте уважаемые эксперты!
У меня такой вопрос:
у меня есть формула c=b*a , 'b' известно ,'а'- переменная.Как сделать так чтобы при вводе "а" программа при ее закрытии сохраняла эту переменную, а то приходится вводить кажд...Вопрос № 39779: Здравствуйте! Подскажите, пожалуйста, как задать нужный заголовок к сообщение ShowMessage()? Заранее спасибо!...
Вопрос
№ 39.710
Здравствуйте уважаемые эксперты! Попытался недавно сделать программку, которая бы отсылала информацию на сервер методом POST. Не получилось. Нашёл пример (он в приложении), но при отладке он выдаёт "Invalid variant type". (ошибка происходит в самом конце
We.Navigate2(vWebAddr, vFlags, vFrame, vPostData, vHeaders); )
Вопрос: Что тут неправильно (я так и не смог понять, в чём же проблема)?
Заранее спасибо.
Приложение:
Отправлен: 08.04.2006, 10:14
Вопрос задал: Chapay (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: AnD1
Здравствуйте, Chapay!
Можно решить проблему другим способом - использовать другой "метод" для реализации POSTa: формируем url:
http://some_site.ru/script.cgi?parametr1=qwerty¶metr2=123456¶metr3=asdfg
Аналогичным образом можно сформировать Ваш запрос. А реализовать его в Вашей проге, можно иcпользуя компонент TWebBrowser (вкладка Internet) и передавать этот урл через WebBrowser.Navigate ('урл');
Но тут есть один "подводный камень" если передавать в качестве параметра русские буквы, то сервер их будет "кушать" закорючками, а избавиться от этого можно следующи кодом (см. прил.)
Приложение:
Ответ отправил: AnD1 (статус: 3-ий класс)
Ответ отправлен: 08.04.2006, 11:22 Оценка за ответ: 5
Вопрос № 39.727
Как сделать окно "О программе" в стиле Windows (как, например, у игры Сапёр)?
--------- Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор) Россия, Тула WWW:Программирование на DELPHI: Всё для программиста. ICQ: 286837644 ---- Ответ отправлен: 08.04.2006, 15:55 Оценка за ответ: 5 Комментарий оценки: Правда, свою иконку так и не получилось заставить отображать, но и не надо.
Отвечает: AnD1
Здравствуйте, Злоумышленник!
В хелпе дельфи описан процесс создания такого окна, см.:
"Component Writer's Guide" => "Making a dialog box a component"
А вот здесь можно почитать об этом по подробнее:
"Win32s Programmer's Reference" => в поиске набрать "about" и будет много интересной инфы (в частности, можно узнать как винда создает эти окошки :)) )
(Извинясь, что не дал конкретного ответа, т.к. в одном маленьком ответе трудно описать создание целого класса ;) )
Ответ отправил: AnD1 (статус: 3-ий класс)
Ответ отправлен: 08.04.2006, 16:03
Отвечает: Хакимов Денис Рафаилович
Здравствуйте, Злоумышленник!
Попробуйте использовать winapi функцию
ShellAbout (HANDLE hWnd,// хэндл родительского окна
PChar szApp, //заголовок и первая строка текста(название программы)
PChar szOtherStuff, // другой текст (описание программы)
HICON hIcon // отображаемая иконка
);
Для использования Вам нужно будет добавить в раздел "uses" модуль "ShellApi". Простейший пример в приложении.
Удачи!
Приложение:
--------- Цель жизни есть жизнь с целью
Ответ отправил: Хакимов Денис Рафаилович (статус: 7-ой класс)
Ответ отправлен: 08.04.2006, 16:30 Оценка за ответ: 5
Отвечает: Mrdimon
Здравствуйте, Злоумышленник!
Это сделать достаточно просто.
Прежде всего Вам необходимо иметь логотип той ОС, под которой будет выполняться Ваша программа. Его найти можно в системной папке Win. У меня стоит Windows 2000 Pro, но, думаю, что труда найти в других ОС не составит! :-)
Так вот, у меня он находится здесь: ...Winntwinnt256.bmp. Учтите, что файл имеет аттрибут "скрытый" и "системный".
А остальное - завист целиком и полностью от Вас - то ли Вы ограничетесь выводом логотипа ОС, информацией о Вас, любимом, Вашей программе. то ли добавите туда информацию о времени работы ОС, версии ОС, задействованной/свободной памяти, дисковом пространстве и т.д.
Удачи! :-)
Ответ отправил: Mrdimon (статус: 1-ый класс)
Ответ отправлен: 08.04.2006, 22:18 Оценка за ответ: 4
Вопрос № 39.746
Здравствуйте.
Есть проблема объясните в чём у меня ошибка. Код компилируется нормально, но после открытия OpenDialog’a и выбора нескольких файлов выдаётся ошибка, что-то вроде Abstract Error. Вот этот код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
Filec:Tstrings;
begin
if OpenDialog1.execute then
filec:=Tstrings.Create;
for i:=1 to filec.Count-1 do
s:=ExtractFileext(filec[i]);
if s='.wav' then memo1.lines.add(filec[i]);
if s='.mp3' then memo2.lines.add(filec[i]) else
memo3.lines.add(filec[i]);
end;
Отправлен: 08.04.2006, 20:26
Вопрос задал: Dimon007 (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Ерёмин Андрей
Здравствуйте, Dimon007!
Замените filec:=Tstrings.Create; на filec:=Tstringlist.Create; --------- Нет правила без исключений. Правило без исключений - исключение из правил.
Итак, начнем разбор ошибок:
1. Вы используете абстрактный класс TStrings, а надо использовать класс-потомок TStringList.
2. Если пользователь нажмет отмену в диалоге, то на строчке
for i:=1 to filec.Count-1 do
неминуемо возникнет ошибка, т.к. объект Filec еще не создан, а Вы уже пытаетесь получить доступ к его свойствам.
3. Надо полагать, что Вы не правильно обрабатываете цикл for ... to ... do.
4. После того, как Вы попользуетесь объектом, нужно освобождать от него память, иначе Ваша программа, в один прекрасный момент может набрать столько памяти, сколько у пользователя нет в наличии (используйте метод Free объектов).
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
i: integer;
Filec: TstringList;
begin
if not OpenDialog1.execute then Exit;
Filec:= Tstrings.Create;
for i:=1 to Pred(Filec.Count) do
begin s:= ExtractFileext(Filec[i]);
if (s = '.wav') then memo1.lines.add(Filec[i])
else if (s = '.mp3') then memo2.lines.add(Filec[i])
else memo3.lines.add(Filec[i]);
end;
end;
Кроме того, я бы Вам рекомендовал давать более "говорящие" названия компонентам (в т.ч. и форме), нежели Memo1, Memo2, ... . Это позволит Вам в дальнейшем лучше разбираться в собственном же проекте при большом количестве различных компонентов на форме.
Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 08.04.2006, 23:09
Отвечает: Kazakh
Здравствуйте, Dimon007!
Добавлю...
Мне не понятно для чего вы используете filec?
Судя по описанию "...после открытия OpenDialog’a и выбора нескольких файлов..." вы выбираете несколько файлов и в зависимости от расширения добавляете в разные мемо.
Тогда проще использовать стандартное свойство OpenDialog.Files.
Моё решение с коментами в приложении. Оно работает даже, если выбран один файл.
Также необходимо использовать приведение к одному регистру.
Поправлю Вас и других экспертов:
for i:=0 to Pred(Files.Count) do - список же с нуля начинается.
Приложение:
--------- Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 5-ый класс)
Ответ отправлен: 10.04.2006, 12:09
Вопрос № 39.760
Кто-нибудь знает, как через Delphi сжимать (ну и восстанавливать неплохо бы) M$ Access БД? Суть проблемы: прога (юзает Access-таблицу, формат 2000) отработала, закрывается, самое время сжать. Установка в самом Access'е галочки "сжимать при закрытии" при работе через Dельфина не действует. Спасибо.
Небольшое пояснение:
когда Вы ставите галочку в Access "Сжимать при закрытии", то сама Access за этим и следит. Как только Вы запускаете из-под своего приложения базу, то и следите за базой тоже Вы.
Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 09.04.2006, 00:08 Оценка за ответ: 5 Комментарий оценки: Да, я уже нашел.
Вопрос № 39.762
Здраствуйте уважаемые эксперты!
У меня такой вопрос:
у меня есть формула c=b*a , 'b' известно ,'а'- переменная.Как сделать так чтобы при вводе "а" программа при ее закрытии сохраняла эту переменную, а то приходится вводить каждый раз (использовал Edit)?
Зарание спасибо!
p.s. и напомните про оценку ,а то забуду!!!!!!!!!!!!!!!
Есть два варианта:
1. Сохранить переменную а в файл
2. Сохранить ее в реестре
Предпочтительнее, конечно же, сохранить в файл.
Самое простое:
в Form.OnCreate прописать:
var S: string; F: TextFile;
begin
if FileExists('a.txt') then
begin AssignFile(F, 'a.txt');
Reset(F);
Readln(F, S);
CloseFile(F);
Edit1.Text:= S;
end;
end;
А в Form.OnClose следующее:
var S: string; F: TextFile;
begin AssignFile(F, 'a.txt');
Rewrite(F);
S:= Edit1.Text;
Writeln(F, S);
CloseFile(F);
end;
Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 09.04.2006, 00:25
Отвечает: Mrdimon
Здравствуйте, Lamer_Brother!
Возможно, содержимое приложения Вам поможет.
Здесь реализован пример сохранения настроек (в Вашем случае переменной а) в '*.ini' файле. Так же возможно сохранение настроек, например в реестре (для работы с реестром служит TRegistry), в обыкновенном текстовом файле, так и в лог файле. По моему, наиболее для этих целей подходит *.ini файл.
Если что не так - не судите строго! :-)
Удачи!
p.s. просили напомнить об оценке? НАПОМИНАЮ! ХОЧУ ОЦЕНКУ!
Приложение:
Ответ отправил: Mrdimon (статус: 1-ый класс)
Ответ отправлен: 09.04.2006, 14:43
Отвечает: Хакимов Денис Рафаилович
Здравствуйте, Lamer_Brother!
Варианта 2 - или сохраняйте в реестре, или (что ИМХО лучше) в файле, который лежит в папке с программой. Простейший пример в приложении. Создается файл "save.dat" в который мы и сохраняем переменную. Надеюсь пояснения к приложению понятны :).
Удачи!
Приложение:
--------- Цель жизни есть жизнь с целью
Ответ отправил: Хакимов Денис Рафаилович (статус: 7-ой класс)
Ответ отправлен: 09.04.2006, 16:44
Вопрос № 39.779
Здравствуйте! Подскажите, пожалуйста, как задать нужный заголовок к сообщение ShowMessage()? Заранее спасибо!
Application.MessageBox('Здесь текст сообщения', 'Здесь заголовок сообщения', MB_OK);
Успехов!
Ответ отправил: Лучников Ю.В. (статус: *Мастер) Россия, Киров WWW:нЧат - Наш Чат! ICQ: 176308580 ---- Ответ отправлен: 09.04.2006, 09:16 Оценка за ответ: 5
Отвечает: Хакимов Денис Рафаилович
Здравствуйте, Андрющенко Вячеслав Васильевич!
Изменить заголовок диалога, вызванного с помощью ShowMessage можно, но Вам придется искать его хэндл и с помощью функции SetWindowText менять заголовок.
Проще и эффективнее использовать функцию:
int MessageBox(
HWND hWnd, // хэндл родительского окна
PChar lpText, // текст сообщения
PChar lpCaption, // текст заголовка
Cardinal uType /* стиль окна сообщения, задается определенными константами с префиксом MB_ */
);
Пример приведен в приложении.
Удачи!
Приложение:
--------- Цель жизни есть жизнь с целью
Ответ отправил: Хакимов Денис Рафаилович (статус: 7-ой класс)
Ответ отправлен: 09.04.2006, 12:46 Оценка за ответ: 5
Отвечает: Mrdimon
Здравствуйте, Андрющенко Вячеслав Васильевич!
ShowMessage отображает простое окно сообщения с кнопкой OK. Текст сообщения задается параметром Msg. Заголовок окна совпадает с именем выполняемого файла приложения.
Имеется также похожая процедура ShowMessageFmt, позволяющая выводить форматированное сообщение.
При необходимости анализировать ответ пользователя на сообщение пользуйтесь функцией Delphi MessageDlg.
Удачи! :-)
Ответ отправил: Mrdimon (статус: 1-ый класс)
Ответ отправлен: 09.04.2006, 15:31
Отвечает: Diman_A
Здравствуйте, Андрющенко Вячеслав Васильевич!
Showmessage ты будешь юзать, когда тебе надо, например, какую-нибудь debug инфу из программы выцепить. А пользователю это не пойдет - коряво как-то. Предлагаю использовать MessageBox:
MessageBox(form1.Handle, 'Текст сообщения', 'Заголовок', MB_ICONWARNING OR MB_YESNOCANCEL);
Другие типы иконок в сообщении:
MB_ICONWARNING;
MB_ICONERROR;
MB_ICONINFORMATION;
Виды кнопок:
MB_OK;
MB_OKCANCEL;
MB_ABORTRETRYIGNORE;
MB_YESNOCANCEL;
MB_YESNO;
MB_RETRYCANCEL;
Ответ отправил: Diman_A (статус: 8-ой класс)
Ответ отправлен: 09.04.2006, 16:03
Отвечает: Kazakh
Здравствуйте, Андрющенко Вячеслав Васильевич!
К вышеперечисленному добавлю, что заголовок для окна ShowMessage берется такой же как и название приложение.
Поэтому если уж очень сильно хочется делайте так:
Application.Title:='Мой новый заголовок';
перед каждым вызовом ShowMessage.
Я бы использовал Application.MessageBox. Так он позволяет делать всё что угодно.
К тому же с ShowMessage у меня были проблемы (не выходило на передний план), если вызывалось из дочернего окна MDI приложения при открытых других дочерних окнах. А
Application.MessageBox в любом случае на передний план вылезет :-)
--------- Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 5-ый класс)
Ответ отправлен: 10.04.2006, 17:10