Вопрос № 37458: Здраствуйте!!!
Необходимо холст формы (а лу...Вопрос № 37460: Здравствуйте!!!
Я задавал уже вопрос "как закрыть чужую программу". Вы посоветовали через функцию FindWindow(). Но у меня оказалась задача сложнее, чужая программа не имеет окна, а сидит в трее. Есть только процесс. Помогите пожалуйста ...Вопрос № 37465: Здравствуйте, Уважаемые эксперты!
На форме имеется только одна кнопка. Как программно нажать на кнопку?
...Вопрос № 37481: Здравствуйте Эксперты!
Этот код замечательно работает под 98 виндой но в ХР вообще не печатает
var FDevice : PChar;
FPort : PChar;
FDriver : PChar;
FDeviceMode : THandle;
f,lps : textfile;
s : string;
...
Get...Вопрос № 37487: Здравствуйте эксперты. Вот решил написать программку по выдиранию определенных данных с любого файла. Поясняю. Значится мне нужно с любого файла скопировать участок от FF D8 по FF D9 (шестнадцатеричном), и сохранить это в файл 01, а потом искать след...Вопрос № 37492: Уважаемые эксперты прошу вас ответить на такой вопрос!!!!!
Как на делфи сохранить в exсel.файле то что набито на форме при нажатии на кнопку
...Вопрос № 37493: Добрый день!
Снова я с темже вопросом.
Разве нет способов обеденить несколько проектов в один. Все это запихать в один экзешник. Чтоб можно было програмно вызывать тот или иной проект.
Если нет такой аозможности, то хоть напишите об этом....Вопрос № 37515: Добрый день.
Помогите пожалуйста с созданием процедуру.
Изначально файл выглядит так:
Логин1|Логин2|Логин3|ЛогинN| - логины в базе постоянно меняются, добавляются, удаляются.
А нужно чтобы выглядело вот так:
#B...
Вопрос № 37.458
Здраствуйте!!!
Необходимо холст формы (а лучше часть холста) сохранить в графический файл.Как?
Заранее спасибо!!!
Отправлен: 13.03.2006, 21:38
Вопрос задал: Piit (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Leshiy2006
Здравствуйте, Piit! создаете TImage
var
MYIm:TImage;
begin
MYim:=TImage.Create;
//задаете размеры
далее копируете канву формы (Brush Copy -в хелпе хорошо описан )
и сохраняете MyIm.Picture.SaveToFile
Удачи!
Ответ отправил: Leshiy2006 (статус: 4-ый класс)
Ответ отправлен: 13.03.2006, 22:52 Оценка за ответ: 5
Отвечает: sir henry
Здравствуйте, Piit!
Интересный термин - "холст формы". :) Обычно говорят про "канву формы", в соответствии с английским названием поверхности рисования.
Если нужно сохранить какую-либо часть, то можно воспользоваться дополнительной канвой, в которую скопировать часть изображения с формы:
Var
bm: TBitmap;
Begin
bm:=TBitmap.Create;
Form1.Canvas.CopyRect(DestRect, bm.Canvas, SourceRect);
bm.SaveToFile(Имя_файла);
bm.Free;
End;
Здесь:
DestRect - координаты прямоугольника, в которые вставляется часть изображения с формы,
SourceRect - координаты прямоугольника области формы, которую нужно скопировать.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 14.03.2006, 05:57 Оценка за ответ: 5
Отвечает: Ataman N. N.
Здравствуйте, Piit!
Создаете объект типа TBitmap. Задаете ему размер, а потом выполняете копирование из Canvas формы в Canvas TBitmap'а, и ,наконец, сохраняете содержимоеTBitmap'а в файл с помощью метода SaveToFile(<FilNeme>). Не забудьте уничтожить объект TBitmap методом Free.
Ответ отправил: Ataman N. N. (статус: 9-ый класс)
Ответ отправлен: 14.03.2006, 18:03 Оценка за ответ: 5
Вопрос № 37.460
Здравствуйте!!!
Я задавал уже вопрос "как закрыть чужую программу". Вы посоветовали через функцию FindWindow(). Но у меня оказалась задача сложнее, чужая программа не имеет окна, а сидит в трее. Есть только процесс. Помогите пожалуйста решить эту программу. Огромное Спасибо.
Отвечает: Cheater76
Здравствуйте, Мурник Роман!
Данная функция позволяет завершить выполнение любой активной программы по её classname или заголовку окна.
procedure KillProgram(Classname : PChar; WindowTitle : PChar);
const
Ответ отправил: Cheater76 (статус: 1-ый класс)
Ответ отправлен: 14.03.2006, 09:37 Оценка за ответ: 4 Комментарий оценки: Так не работает FindWindow('proga.exe', nil); в списке процессов она называется proga.exe, а окна не имеет.
Отвечает: Татьяна
Здравствуйте, Мурник Роман!
Честно говоря просто не хочется выдирать куски из чужого кода, написать свои особо нет времени, поэтому дам вам ссылочку на исходник, как по мне, достаточно полезной программки, я думаю кроме "закрытия чужой программы" вы найдете там еще много интересного и полезного.
Приложение:
--------- Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 14.03.2006, 20:29
Отвечает: Diman_A
Здравствуйте, Мурник Роман!
Функция для закрытия - в приложении. Так можно убить прогу, которая не запрещает открытие своего процесса с флагом PROCESS_TERMINATE. Если же тебе попалась именно такая (напр. Антивирус Касперского и подобные проги) то пиши мне на мыло, помогу.
Приложение:
Ответ отправил: Diman_A (статус: 7-ой класс)
Ответ отправлен: 15.03.2006, 17:14
Вопрос № 37.465
Здравствуйте, Уважаемые эксперты!
На форме имеется только одна кнопка. Как программно нажать на кнопку?
Отправлен: 14.03.2006, 00:53
Вопрос задал: Solovej (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Если что не ясно - пиши в форуме или в личку, но там все основные "фишки" есть.
--------- Пусть все будет хорошо! Давайте жить дружно! :) И будет жить еще лучше!
Ответ отправил: LanK (статус: 9-ый класс)
Ответ отправлен: 14.03.2006, 09:18 Оценка за ответ: 5
Отвечает: Николай Б.
Здравствуйте, Solovej!
Добавь обработчик события (Form1.OnShow или по таймеру) и напиши там
Button1.Click;
Не забудь в Button1.OnClick создать какое-нибудь событие.
Ответ отправил: Николай Б. (статус: 2-ой класс)
Ответ отправлен: 14.03.2006, 09:21 Оценка за ответ: 5
Отвечает: Cheater76
Здравствуйте, Solovej!
Вы можете сделать кнопку "нажатой" или "ненажатой", посылая ей сообщение BM_SETSTATE. Определить ее текущее состояние можно, послав ей сообщение BM_GETSTATE.
Для нажатия кнопки:
Button1.Perform( BM_SETSTATE, 1, 0 );
Для отжатия кнопки:
Button1.Perform( BM_SETSTATE, 0, 0 );
Чтобы обнаружить нажатие кнопки:
ButtonPressed := Button1.Perform( BM_GETSTATE, 0, 0 ) = 1;
Ответ отправил: Cheater76 (статус: 1-ый класс)
Ответ отправлен: 14.03.2006, 09:44 Оценка за ответ: 5
Отвечает: Vadim Vitomsky
Здравствуйте, Solovej!
Если необходимо просто вызвать обработчик нажатия кнопки, в необходимом месте можно просто вставить
Form1.OnButton1Click(nil);
Ответ отправил: Vadim Vitomsky (статус: 5-ый класс)
Ответ отправлен: 14.03.2006, 13:40
Вопрос № 37.481
Здравствуйте Эксперты!
Этот код замечательно работает под 98 виндой но в ХР вообще не печатает
var FDevice : PChar;
FPort : PChar;
FDriver : PChar;
FDeviceMode : THandle;
f,lps : textfile;
s : string;
...
GetMem(FDevice, 128);
GetMem(FDriver, 128);
GetMem(FPort, 128);
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
if FDeviceMode = 0 then
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
PtrPort:=FPort;
AssignFile(f,'d:'+'temp.txt');
AssignFile(lps,PtrPort);
Reset(f);
Rewrite(lps);
while not Eof(f) do begin
Readln(f,s);
Writeln(lps,s);
end;
CloseFile(F);
CloseFile(lps);
...
файл в досовской кодировке большого объема (>5Мб) А3 формата
Отправлен: 14.03.2006, 10:24
Вопрос задал: Cheater76 (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: sir henry
Здравствуйте, Cheater76!
Вообще-то у Вас нет ни одной предпосылки, чтобы Ваш код работал в NT2000ХР2003.
Если уж Вы используете нестандартные приемы программирования, то очень наивно ожидать, что Ваша программа будет работать всегда и везде. Поверьте, со времен MS-DOS многое изменилось. И если 98 по своей наивности и доверчивости позволяет иногда обращаться к устройствам напрямую или в той или иной мере эмулируя это прямое обращение, то основа, на которой построены NT и все ее последования, совершенно другая - никого ни под каким видом не подпускать к устройствам, за исключением когда это делает сама ОС.
В Дельфи, специально для Вашего случая, есть модуль Printers, применение которого ГАРАНТИРУЕТ работу под любой ОС. Мало того, код Вашей программы при его использовании значительно сократится. Вот смотрите:
{$APPTYPE CONSOLE}
Program pr;
Uses Printers;
var
s: string;
f, prn: TextFile;
Begin
AssignFile(f, 'fa.txt');
AssignPrn(Prn);
Reset(f);
Rewrite(prn);
While not Eof(f) do
Begin
ReadLn(f, s);
WriteLn(prn, s);
End;
CloseFile(f);
CloseFile(prn);
End.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 14.03.2006, 10:58
Вопрос № 37.487
Здравствуйте эксперты. Вот решил написать программку по выдиранию определенных данных с любого файла. Поясняю. Значится мне нужно с любого файла скопировать участок от FF D8 по FF D9 (шестнадцатеричном), и сохранить это в файл 01, а потом искать следующую такую же последовательность, и сохранить это в файл 02 и т.д.. Но сохранить не в шестнадцатеричном виде, а в символьном (или как оно там называется?). Единственное, что я понял – это то, что нужно открыть файл для чтения. И найти сперва первую пару байт (FF
D8), а вот как дальше, я не знаю. Особенно интересен процесс копирования и сохранения. Честно перелопатил гору и тележку литературы. Но так как я в Делфи не мастак, то ничего толкового по этой теме я не нашел. Помогите разобраться. Желательно с примером. Заранее благодарен.
З.Ы. Это программа для вырезания картинок и т.д. из файлов. Я думаю это делается по такому принципу. Если нет, то направьте на путь истинный :).
Отправлен: 14.03.2006, 12:24
Вопрос задал: Int20h (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: sir henry
Здравствуйте, Int20h!
Не знаю, огорчит ли Вас известие, что диапазон с FFD8 по FFD9 и есть как раз пара байтов. Для картинки явно маловать, согласитесь. :)
Начали Вы правильно. Файл действительно нужно открыть для чтения. А второй файл, куда нужно будет записать данные - соответственно для записи. Хочу сразу обратить внимание, что выдраные Вами данные не будут во втором файле являтся картинкой, т.к. функциональность почти любого файла (кроме текстового), определяется его заголовком, который Вы благополучно проигнорировали. Поэтому интерпретация записаных данных целиком и полностью ложиться на Ваши плечи. Приведу лишь общий принцип.
1. Открываем два файла, один на чтение, другой на запись.
2. Ищем в файле для чтения по приведенному Вами смещению от начала файла необходимый кусок данных.
3. Определяемся с величиной того куска, который нужно прочитать.
4. Читаем этот кусок в буфер.
5. Записываем из буфера во второй файл.
6. Закрываем оба файла.
К сожалению непонятно, что Вы имели в виду под словами "...потом искать следующую такую же последовательность...". Т.е. второй кусок должен содержать один в один такую же информацию, что и тот, что Вы только что прочитали? А смысл тогда какой его искать? Просто запишите его столько раз, сколько Вам нужно.
Пожалуйста, проясните этот вопрос. Иначе ответ будет далек от того, что Вам нужно.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 14.03.2006, 12:41
Отвечает: Полховский Александр Владимирович
Здравствуйте, Int20h!
Значится так.
Первым делом мы открываем исходный файл для чтения и по порядку читаем из него по 2 байта, пока не встретим комбинацию FF D8. Как нашли - записываем последующие байты до FF D9 в строку String1. После этого сохраняем строку в файл. Повторяем всё это до тех пор, пока не будет найден конец файла.
var
readf1, writef1: text;
n1: integer;
string1: string;
tmpstr1: string[2];
begin
n1:=0;
assignfile(readf1, <имя файла jpg>);
reset(readf1);
repeat
string1:='';
assignfile(writef1, 'out'+inttostr(n1)+'.txt');// создаём новый файл для записи
rewrite(writef1);
repeat
read(tmpstr1, readf1);
until (tmpstr=#255+#216)or(eof(readf1)); //FF D8
string1:=tmpstr1;
if not(eof(readf1))
then
repeat
read(tmpstr1, readf1);
string1:=string1+tmpstr1;
if length(string1)=254 //если сртока переполнена
then
begin
write(string1, writef1); //записываем в файл и обнуляем
string1:='';
end;
until (tmpstr=#255+#217)or(eof(readf1)); //FF D9
if not(eof(readf1))
then
begin
string1:=string1+tmpstr;
write(string1, writef1);
end;
until eof(readf1);
closefile(readf1);
closefile(writef1);
end;
Я не проверял, могут быть и ошибки. Но в основном так всё и будет. Можно другой механизм буфера использовать. На Ваше усмотрение.
--------- Спасём нашу хрупкую планету !
Отвечает: Николай Б.
Здравствуйте, Zatyahnyh A.A.!
Я не понял, что значит "набито на форме".
Могу предложить код, сохраняющий в exel-файл StringGrid:
function RefToCell(ARow, ACol: Integer): string;
begin
Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
end;
function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;
const
xlWBATWorksheet = -4167;
var
Row, Col: Integer;
GridPrevFile: string;
XLApp, Sheet, Data: OLEVariant;
i, j: Integer;
begin
// Prepare Data
Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
for i := 0 to AGrid.ColCount - 1 do
for j := 0 to AGrid.RowCount - 1 do
Data[j + 1, i + 1] := AGrid.Cells[i, j];
// Create Excel-OLE Object
Result := False;
XLApp := CreateOleObject('Excel.Application');
try
// Hide Excel
XLApp.Visible := False;
// Add new Workbook
XLApp.Workbooks.Add(xlWBatWorkSheet);
Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet.Name := ASheetName;
// Fill up the sheet
Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,
AGrid.ColCount)].Value := Data;
// Save Excel Worksheet
try
XLApp.Workbooks[1].SaveAs(AFileName);
Result := True;
except
// Error ?
end;
finally
// Quit Excel
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
end;
end;
Использование:
procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveAsExcelFile(stringGrid1, 'My Stringgrid Data', 'MyExcelFile.xls') then
ShowMessage('StringGrid saved!');
end;
Ответ отправил: Николай Б. (статус: 2-ой класс)
Ответ отправлен: 15.03.2006, 07:07 Оценка за ответ: 5 Комментарий оценки: Спасибо огромное !!!!!!! Я только начинаю Вы не поняли , на форме это значит в любом месте т.е. допустим в ComboBox сохранить то что выведено
Вопрос № 37.493
Добрый день!
Снова я с темже вопросом.
Разве нет способов обеденить несколько проектов в один. Все это запихать в один экзешник. Чтоб можно было програмно вызывать тот или иной проект.
Если нет такой аозможности, то хоть напишите об этом.
Отправлен: 14.03.2006, 13:49
Вопрос задал: AllexZ (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Lexus
Здравствуйте, AllexZ!
Не знаю может это помочь или нет но вот способ вызвать другое приложение:
if fileexists('C:app.exe') then
winexec(pansichar('C:app.exe'),SW_SHOWDEFAULT);
где app.exe - имя приложения.
PS Если не поможет то не надо 2 ставить :)
Ответ отправил: Lexus (статус: 2-ой класс)
Ответ отправлен: 14.03.2006, 17:46 Оценка за ответ: 5 Комментарий оценки: Да этот способ мне известен. Но мне требуется немного другое. Но все равно спасибо за ответ.
Отвечает: Татьяна
Здравствуйте, AllexZ!
Ну что касается вашего случая, я думаю самым оптимальным будет не объединять все в один проект, а сделать что-то типа еще одного приложения с выбором одного из ваших приложений
При выборе определенного приложения запускаете его (например с помощью winexec), а окно выбора скрываете (hide) и запускаете таймер который отслеживает загружено ли одно из ваших насколько я помню четырех приложений, если ни одно из приложений не запущено (т.е. вы его закрыли) - опять показываете окно выбора приложений.
Ну вот такой способ, остается его только реализовать, вообщем-то проблем возникнуть не должно, но если будут более конкретные вопросы - спрашивайте.
Если такой способ вам не по душе, ну что ж.... это всего лишь вариант
--------- Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 14.03.2006, 20:03 Оценка за ответ: 5 Комментарий оценки: Да это все понятно. Но ы имел в виду всетаки один экзешник, так немного удобне. Спасибо за ответ.
Вопрос № 37.515
Добрый день.
Помогите пожалуйста с созданием процедуру.
Изначально файл выглядит так:
Логин1|Логин2|Логин3|ЛогинN| - логины в базе постоянно меняются, добавляются, удаляются.
Отвечает: Leshiy2006
Здравствуйте, Анна Николаевна!Вопрос до конца не ясен:файл 1-го типа нужно преобразовать в файл 2-го типа или надо писать в файл по 2-му алгоритму
если преобразовать, то создаете строковую переменную S, считываете файл в одну строку, а далее cчитываете стороку по символу (к примеру используйте Copy) и сравниваете символ с "|"
если нет то символ прибавляете к S, если да то записываете S в файл и обнуляете S.
Удачи!
Ответ отправил: Leshiy2006 (статус: 4-ый класс)
Ответ отправлен: 14.03.2006, 23:08
Отвечает: Полховский Александр Владимирович
Здравствуйте, Анна Николаевна!
var
Strs1: TStrings;
begin
strs1:=tstringlist.Create;
strs1.Add('#Base');
if length(edit3.Text)<>0
then
repeat
strs1.Add('#new');
strs1.Add(ansileftstr(edit3.Text, pos('|', edit3.Text)-1));
edit3.Text:=ansirightstr(edit3.Text, length(edit3.Text)-pos('|', edit3.Text));
until length(edit3.Text)=0;
Вместо Edit3.Text - любая строковая переменная, в которой содержится та самая строка Логин1|Логин2|Логин3|ЛогинN|
В uses дописать StrUtils
--------- Спасём нашу хрупкую планету !