Вопрос № 22815: Приветствую всех кто читает это письмо.
Правил я не помню так что извеняюсь за то что задам сразу два вопроса.
1) Как нажатием одной кнопки остановить (поставить на паузу) то что выполняется после нажатия другой.
2) Необходимо сделать Wri...Вопрос № 22821: Здравствуйте.
Как с помощью дельфи открыть файл mdb в access. Т.е. запускался access и открывался нужный файл. Я слышал что это можно сделать shell.
Всем заранее спасибо....Вопрос № 22832: C помощью какой программы можно добавлять в *.res файлы html файлы, а то я постоянно для этих целей использовал ResHacker, но после него часто *.res файл накрывается....Вопрос № 22837: Привет всем!!!
Ребята у меня большая проблема нужно на Delphi создать приложение по рисованию кружков и стрелок что их соединяют (графов) и что б можно их двигать по полю и стрелки перерисовывались. Мне такой курсак дали не знаю как и начать. Сна...Вопрос № 22852: Привет всем!
Требуется по истечении какого-либо промежутка времени средней(!) величины (полчаса, час, два часа) выполнять определённое действие. Подскажите, как лучше подойти к этому вопросу с точки зрения реализации? Чем пользоваться? Таймером? ...Вопрос № 22875: Здраствуйте уважаемые эксперты, у меня такойвопрос, как сделать чтобы при запуске програма сама себя скопировала в конкретную папку, например C:program files . Заранее спасибо....
Вопрос № 22.815
Приветствую всех кто читает это письмо.
Правил я не помню так что извеняюсь за то что задам сразу два вопроса.
1) Как нажатием одной кнопки остановить (поставить на паузу) то что выполняется после нажатия другой.
2) Необходимо сделать Writeln и Readln для Memo, или чтото похожее главное чтобы при вводе счётчик строк сам увеличивался на 1, а при считывании ожидалось нажатие Enter.
Заранее благодарю за ответ.
P.S. По поводу уточнений пешите на pegmeyme@xaker.ru
Отправлен: 29.06.2005, 00:58
Вопрос задал: GREEDY (статус: Посетитель)
Всего ответов отправлено: 5
Отвечает: sir henry
Здравствуйте, GREEDY!
1) Встречный вопрос:
а что у Вас запускается по нажатию первой кнопки? Здесь не чтецы мыслей на расстоянии, а обычные люди. :)
2) Смеетесь да?
Мемо это массив строк. Вот от этого и пляшите:
а) Добавить строчку - Memo.Lines.Add(s);
б) Прочитать строчку - s:=Memo.Lines[Индекс_строки];
в) Изменить какую либо строку - Memo.Lines[Индекс_строки]:= s;
Изменеие счетчика строк это автоматически - это полностью Ваша забота, например цикл организуйте:
For i:=0 to 39 do
Memo.Lines.Add:='Ваша строка или что там еще';
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.06.2005, 06:56
Отвечает: Tsechoev Bagaudin
Здравствуйте, GREEDY!
1. Для этого не обходимо поднять отдельный поток и синхронизировать с помощью семафоров или мьютексов. Если не разберешься пиши на форум по Delphi http://www.ingush.com
2. У мемо есть свой счетчик строк Memo1.Lines.Count и строка у него как раз то что заканчивается на "нажатии enter".
Memo1.Lines.Add('Строка 1') - WriteLn
Memo1.Lines.Strings[0] - ReadLn
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 6-ой класс)
Отправлен: 29.06.2005, 09:59
Отвечает: Ерёмин Андрей
Здравствуйте, GREEDY!
1) Думаю, проще всего завести переменную (например, PActive: Boolean). Когда какое-то действие выполняется, периодически проверять состояние этой переменной. Если оно False, то прекращать операцию, если True - то продолжать. Соответственно, первая кнопка будет делать PActive:=False, а перед запуском действия нужно поставить PActive:=True. Или можно использовать потоки (Threads).
2) Думаю, проще всего перехватывать нажатия клавиш. В Memo.OnKeyDown пропишите: If (Key=VK_LEFT) or (Key=VK_RIGHT) or (Key=VK_UP) or (Key=VK_DOWN) Then Key:=0; Это запретит перемещать курсор по текстовому полю.
If (Key=VK_RETURN) Then Begin Memo.Lines.Add(''); Memo.CaretPos.Y:=Memo.Lines.Count-1; End; - это поместит кусрор на строку ниже. Думаю, так. А вообще, можно создать консольное приложение.
--------- Жизнь - игра, в которой нет setup'а...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 29.06.2005, 10:37
Отвечает: Delphin
Здравствуйте, GREEDY!
1. Смотря что ты выполняеш. Если в отдельном потоке то для этого есть спец. функции потоков. Щас точно не помню но Resume, Pause (Вроде так).
Если ты запускаеш цикл в главном потоке вот так:
Repeat
// Что повторяеш
until {что-то не сделается} or {кнопка не будет нажата допустим}.
end
2. Непонял вопроса. В MEMO и так можно ввожить текст. Просто на событие ввода/смены текста сделай свою обработку.
--------- Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 29.06.2005, 10:39
Отвечает: Jadd
Здравствуйте, GREEDY!
1) объявляешь глобальную переменную, например, bIsRunning: Boolean. И дальше одной кнопкой ставишь в true, а другой - считываешь, делаешь что-то и ставишь в false.
2) Не совсем понятно что нужно. Memo - массив строк. ОТсюда и пляши. Делаешь либо динамический массив типа String, либо TStringList. Чтение Readln до нажатия enter - по сути цикл while ... do, в котором условием окончания ввода будет клавиша enter.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 29.06.2005, 10:57
Вопрос № 22.821
Здравствуйте.
Как с помощью дельфи открыть файл mdb в access. Т.е. запускался access и открывался нужный файл. Я слышал что это можно сделать shell.
Всем заранее спасибо.
Отправлен: 29.06.2005, 07:03
Вопрос задал: Crick (статус: Посетитель)
Всего ответов отправлено: 5
Отвечает: sir henry
Здравствуйте, Crick!
Через функцию ShellExecute(). Только, естественно, нужно чтобы у Вас Access на машине стоял. :)
Так-же необходимо подключить модуль ShellAPI (в нем расположена эта функция).
Синтаксис:
ShellExecute(
hwnd, // Хэндл родительского окна
lpOperation, // Что делаем с файлом - 'open' - открыть
lpFile, // Имя файла
lpParameters, // Параметры, можно поставить NIL
lpDirectory, // Рабочий каталог, тоже можно поставить NIL
INT nShowCmd // Как показывать окно, обычно SW_SHOW
);
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.06.2005, 07:52
Отвечает: Tsechoev Bagaudin
Здравствуйте, Crick!
Если Delphi 7 то AccessApplication на вкладке Servers и юзай его там много чего можно, а shell это 19 век.
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 6-ой класс)
Отправлен: 29.06.2005, 10:13
Отвечает: Delphin
Здравствуйте, Crick!
Если я тебя правильно понял то ты хочеш что-бы при каком-то событии в твоей программе открывался Microsoft Access нужный тебе файл.
Если да то тогда используй ShellExecute(); - Эта функция находится в Unit'e - ShellApi.
Если ты хотел работать с Access прямо из своей программы то тебе надо научится работать с OLE.
--------- Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 29.06.2005, 10:35
Отвечает: Ерёмин Андрей
Здравствуйте, Crick!
Элементарно:
ShellExecute(Handle,'open','msaccess.exe','C:Documentsase1.mdb','',SW_SHOWNORMAL);
Если файлы *.mdb ассоциированы с Access, то можно просто запускать сам файл (без вызова msaccess.exe).
--------- Жизнь - игра, в которой нет setup'а...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 29.06.2005, 10:37
Отвечает: Jadd
Здравствуйте, Crick!
Дык есть три функции для этого. ShellExecute, winexec, CreateProcess. Вторая уже устраевшая в немогу и основана на CreateProcess только без наследования хэндлов. Все основано на файловых ассоциациях. Запускаешь файл, а ось запускает нужное приложение. А если хочешь к структуре достучаться, то юзай ADO.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 29.06.2005, 10:51
Вопрос № 22.832
C помощью какой программы можно добавлять в *.res файлы html файлы, а то я постоянно для этих целей использовал ResHacker, но после него часто *.res файл накрывается.
Отправлен: 29.06.2005, 10:42
Вопрос задал: source (статус: Посетитель)
Всего ответов отправлено: 5
Отвечает: sir henry
Здравствуйте, source!
А зачем именно в RES? Добавляйте в RC - это обычный текстовый файл, потом RC компилируете с помощью brcc32 (получается RES) и добавьте RES файл в текст всоей программы.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.06.2005, 10:56
Отвечает: Gin
Здравствуйте, source!
Для этих целей используется BRCC32.
Как Все Это делается? Смотрите в приложении!
С Уважением, Gin.
Приложение:
Ответ отправил: Gin (статус: Студент)
Отправлен: 29.06.2005, 12:50
Отвечает: Ерёмин Андрей
Здравствуйте, source!
Я скорее не помогаю, а хочу узнать: почему же он накрывается? Я в ресурсы чего только не добавлял с помощью Resource Hacker - всегда всё нормально работало. Какая, кстати, версия RH? Последняя, вроде бы, - 3.4. Другой, более реальный вариант - хранить в файле ресурсов не html-файл, а txt. Т.е. взять полный код html и записать в текстовый файл. А потом при загрузке ресурса переименовывать расширение файла из "txt" в "html". Думаю, так всё надёжно.
--------- Жизнь - игра, в которой нет setup'а...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 29.06.2005, 13:32
Отвечает: Delphin
Здравствуйте, source!
Я пользуюсь "Restorator 2004 никогда .res файлы не убивает.
А вообще пользоваться надо brc.exe.
Как компилировать ресурсы говорилось не раз.
Если кряк не найдеш могу с этим помочь (delphinster@gmail.com).
--------- Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 29.06.2005, 14:11
Отвечает: John Freeman
Здравствуйте, source!
brcc32 конечно, ну и Resource Workshop...
пример скрипта для brcc32 тут
где testhtml - имя ресурса
RCDATA - секция для ресурса
your.html - имя файла из которого будет создан ресурс
после чего кидаешь получившийся res в папку проекта(строчек=>ресурсов может быть фактически очень много) и {$R your.res}
Приложение:
--------- You're trying to take me They trying to make me This is the only Gives me the only thing Tired of lying, I'm tired of lying The only thing I inderstand is what I feel...
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 29.06.2005, 20:00
Вопрос № 22.837
Привет всем!!!
Ребята у меня большая проблема нужно на Delphi создать приложение по рисованию кружков и стрелок что их соединяют (графов) и что б можно их двигать по полю и стрелки перерисовывались. Мне такой курсак дали не знаю как и начать. Сначала я модифицировал компонент Tshape чтобы в нем можно было выводить метки (номера) а вот со стрелками проблема не знаю как можно в Delphi реализовать. Может у кого то есть готовая процедура или компонент или может кто-то поможет. Буду очень признателен.
Спасибо всем.
Извините за беспокойство
Тарас
Отправлен: 29.06.2005, 12:34
Вопрос задал: btaras (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: sir henry
Здравствуйте, btaras!
Здесь есть компонент типа TShape, в котором помио всего прочего можно делать линии и стрелки:
http://www.torry.net/vcl/packs/interfacelite/misc.zip
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.06.2005, 12:53
Отвечает: Ерёмин Андрей
Здравствуйте.
Я написал простенькую процедуру, которая рисует на канве (TCanvas) стрелку, направленную вправо. Код в приложении. Используемые параметры:
Canvas - канва для рисования (например, Form1.Canvas);
X,Y - координаты начала стрелки (левый верхий угол продолговатой части);
L1 - длина продолговатой части;
L2 - ширина сужающейся части;
H1 - высота продолговатой части;
H2 - длина отклонения наклонных линий от продолговатой части.
FrameColor - цвет границы стрелки;
FillColor - цвет заливки стрелки;
FillStyle - стиль заливки стрелки, например bsSolid (можете посмотреть в св-ве Brush-Style компонента TShape).
Иными словами, стрелка выглядит так (не знаю, корректно ли это отобразится):
_______________|
|
|_______________ /
|/
/продолг. часть/ /суж./
Думаю, с процедурой разберётесь, ничего сложного здесь нет. Если требуется рисовать стрелку влево, вверх или вниз, то придётся изменять все координаты. А вот если стрелка должна быть наклонены под определённым углом, то здесь вам помогут знания алгебры и геометрии :) Воспользоваться нужно arcsin и arccos. Ну а если вам нужно рисовать "простые" стрелочки из трёх линий (одна прямая и две наклонные выходят из её конца), то здесь всё существенно проще. Компонент для рисования стрелок я не встречал, но
наверняка они cуществуют. Ищите по слову "arrow". Удачи!
Приложение:
--------- Жизнь - игра, в которой нет setup'а...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 29.06.2005, 15:47
Отвечает: Master135
Здравствуйте, btaras!
Честно сказать прога у меня такая есть(по работе нейросетей если знаешь что это такое) одна проблема не перерисовываются и не перетягиваются компоненты, но тшейп тоже модифицированный с едитом на нем. Стрелки проводятся автоматически только надо выделять 2 кружка так что если хочещь напиши мне на мыло master135@rambler.ru.Кроме того там описанна работа этой сети с подсчетами результатов. так что если это тебе надо...
Ответ отправил: Master135 (статус: 5-ый класс)
Отправлен: 01.07.2005, 12:35
Вопрос № 22.852
Привет всем!
Требуется по истечении какого-либо промежутка времени средней(!) величины (полчаса, час, два часа) выполнять определённое действие. Подскажите, как лучше подойти к этому вопросу с точки зрения реализации? Чем пользоваться? Таймером? Вроде как он не для этих целей предназначен...
Отправлен: 29.06.2005, 18:22
Вопрос задал: Ерёмин Андрей (статус: Студент)
Всего ответов отправлено: 7
Отвечает: Bochvarov NikB
Здравствуйте, Ерёмин Андрей!
Конечно - таймер. Надо вьибрат (ест и много внешние компоненти), но таймер делфи тоже хорош.
Если хочеш смотрет сколко время осталос - следай интервал 1000мс (или 60000 на минуту) и сделай счетчик. Етот счетчик можеш показьиват как HH:MM:SS или HH:MM.
Ответ отправил: Bochvarov NikB (статус: 4-ый класс)
Отправлен: 29.06.2005, 18:28 Оценка за ответ: 4 Комментарий оценки: Считаем кол-во миллисекунд на час: 1000*60*60 = 3600000. Не многовато для таймера? А сутки? 3600000*24 = 86400000.
Отвечает: Jadd
Здравствуйте, Ерёмин Андрей!
А для каких же целей он предназначен? Нука просвети. Берешь таймер. Ставишь интервал в миллисекундах. Запускаешь и проверяешь. Можно интервал и полчаса ставить и секунду и что еще тебе будет угодно.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 29.06.2005, 18:33 Оценка за ответ: 4 Комментарий оценки: Он нужен, как правило, для отсчёта небольших промежутков времени. В программе пользователь сможет настроить этот интервал, т.е. может поставить даже сутки. Соответственно, тип данных для этого не очень-то и подходит.
Отвечает: Denisss
Здравствуйте, Ерёмин Андрей!
А кто Вам сказал, что он не для этих целей?! Если Вам не нужен высокоточный (с точностью до каждой милисекунды) таймер, то свободно используйте простой TTimer. Полчаса=15 минут * 60 секунд * 1000 миллисекунд = 900000 и т.д.
Ответ отправил: Denisss (статус: 8-ой класс)
Отправлен: 29.06.2005, 19:09 Оценка за ответ: 5 Комментарий оценки: Вот это более реальное решение.
Отвечает: streetcat
Здравствуйте, Ерёмин Андрей!
Как раз для таких самых ;)
не ну на самом деле! Конечно Timer1.Interval := 3600000 выглядит немного некрасиво, но ты делай так (для 1 часа): Timer1.Interval := 60*60*1000;
первая цифра - минуты. Вот так будет как у кулхакеров ;) ;) ;)
--------- WinERROR: Keyboard not detected. Press Enter to continue
Ответ отправил: streetcat (статус: 6-ой класс)
Отправлен: 29.06.2005, 22:09 Оценка за ответ: 5
Отвечает: Tsechoev Bagaudin
Здравствуйте, Ерёмин Андрей!
Вообще-то он как раз для такого рода целей и предназначен. Просто исходи из того, что желательно сделать алгоритм назначенных задач. Если прога подразумевает только их выполнение пользуйся таймером, если есть какие-то другие сопутствующие задачи, то поднимай потоки. Если незнаешь как с ними работать, то пиши на http://www.ingush.com/modules.php?name=Forums в форуме по Delphi. Удачи и знаний!!!
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 6-ой класс)
Отправлен: 29.06.2005, 23:55 Оценка за ответ: 4
Отвечает: sir henry
Здравствуйте, Ерёмин Андрей!
Ну отчего же не для этого, как раз для этого. :)
В таймере задается период, после отсчета которого он выдает сигнал, потом опять считает и опять сигнал и так далее, пока таймер не выключить.
В событие OnTimer записываете свою процедуру, которая делает то что Вам нужно с периодом который Вы определяете в Interval.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 30.06.2005, 05:42 Оценка за ответ: 3
Отвечает: Stamm
Здравствуйте, Ерёмин Андрей!
Ставь Интервал у таймера, причём в миллисекундах, затем в процедуре
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Здесь определённое действие}
Timer1.Enabled:=false;{В самом конце}
end;
Ответ отправил: Stamm (статус: 3-ий класс)
Отправлен: 01.07.2005, 11:53 Оценка за ответ: 2
Вопрос № 22.875
Здраствуйте уважаемые эксперты, у меня такойвопрос, как сделать чтобы при запуске програма сама себя скопировала в конкретную папку, например C:program files . Заранее спасибо.
Отправлен: 30.06.2005, 00:48
Вопрос задал: Staskin (статус: Посетитель)
Всего ответов отправлено: 7
Ответ отправил: komatoz (статус: 2-ой класс)
Отправлен: 30.06.2005, 03:06
Отвечает: Ерёмин Андрей
Здравствуйте, Staskin!
Самый простой способ:
CopyFile(PChar(Application.ExeName),PChar('C:Program Files'+ExtractFileName(Application.ExeName)),False);
--------- Жизнь - игра, в которой нет setup'а...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 30.06.2005, 07:42
Отвечает: Jadd
Здравствуйте, Staskin!
Открываем главный модуль программы и после секции Application.Initialize пишем:
var
curPath: String;
destPath: String;
exeName: String;
Index: Integer;
begin
curPath := Application.ExeName; //текущий путь запускаемого приложения
//destPath будет содержать путь куда копировать
destPath := 'C:Program files';
for Index:= Length(curPath) downto 1 do
begin
if curPath[Index] = '' then
begin
destPath := destPath + exeName;
end
else
exeName := exeName + curPath[Index];
end;
Примерно так.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 30.06.2005, 10:25 Оценка за ответ: 5
Отвечает: Tsechoev Bagaudin
Здравствуйте, Staskin!
procedure TForm1.FormCreate(Sender: TObject);
begin
CopyFile(PAnsiChar(ExtractFilePath(Application.ExeName)+'Project1.exe'),PAnsiChar('C:Program FilesProject1.exe'),True);
end;
Если формы в проге нет, просто подключи юнит Forms и пропиши эту строку в секцию Run.
Удачи!
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 6-ой класс)
Отправлен: 30.06.2005, 10:26
Отвечает: Delphin
Здравствуйте, Staskin!
CopyFile(Application.ExeName,'C:program filesYouAppapp.exe');
Скопирует ваше приложение в папку C:program filesYouApp файл app.exe
Вставь на собтие Form1.OnCreate.
--------- Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 30.06.2005, 10:27
Отвечает: Gin
Здравствуйте, Staskin!
uses ShellApi; // Надо указать
procedure TForm1.FormShow(Sender: TObject);
function FileManage(FromFile, ToFile: string; mode: integer): integer;
var
SHF: TSHFileOpStruct;
frombuf, tobuf: array [0..128] of Char;
begin
FillChar( frombuf, Sizeof(frombuf), 0 );
FillChar( tobuf, Sizeof(tobuf), 0 );
with SHF do
begin
Wnd := 0;
// Задан шаблон, но можно вообще убрать вместе с последним слэшем
pFrom := StrPCopy(frombuf, 'C:Windows*.bmp');
pTo := PChar('C:copy'); // Если папки нет - будет
wFunc := FO_COPY;
fFlags := FOF_NOCONFIRMMKDIR;
end;
Result := SHFileOperation(SHF);
if Result <> 0 then
if SHF.fAnyOperationsAborted then
Result := 1
else Result := 2;
end;
begin
// Если и нужны комментарии - слэши снять
// case
FileManage('C:Windows*.bmp.*', 'C:copy', FO_COPY)
//; of
// 0: ShowMessage ('Все ОК');
// 1: ShowMessage ('Cам прервал');
// 2: ShowMessage ('Ошибка выполнения');
end;
С Уважением, Gin.
Ответ отправил: Gin (статус: Студент)
Отправлен: 30.06.2005, 11:39
Отвечает: streetcat
Здравствуйте, Staskin!
если у твоей проги есть главная форма то в ее обработчике события OnCreate сделай код как в приложении.
если форм нет, то в коде проекта вставь тот же код.
Приложение:
--------- WinERROR: Keyboard not detected. Press Enter to continue
Ответ отправил: streetcat (статус: 6-ой класс)
Отправлен: 04.07.2005, 19:02