Я начинающий, подскажите пожалуйста, как...
Если вы только начинаете осваивать Delphi или считаете, что ваш вопрос простой для более опытных участников форума, то задавайте его здесь, не надо создавать для этого отдельные темы.
Если вы размещаете вопрос здесь, то , пожалуйста, прочтите следующее:
1. когда будете задавать свой вопрос, то делайте это нажимая на "ответ"(не путать с "быстрый ответ") и кратко указывайте в "заголовке" тему своего вопроса;
2. опишите чего вы хотели добиться.
3. если у вас возникла какая-то ошибка, и вы не знаете как её исправить, то обязательно приведите текст самой ошибки;
4. если это необходимо, приведите фрагмент вашего кода(ни в коем случае не надо писать весь код), также при добавлении кода пользуйтесь тегами([code ] и [ /code]);
5. укажите версию Delphi, которую используете и все настройки проекта;
6. если у вас возникли проблемы с нестандартными компонентами, то обязательно приведите ссылку, по которой их можно скачать.
7. соблюдайте правила форума
Удачи.
Модераторы форума Delphi & Kylix: Delpher, kosfiz & OlgaKr
Если вы с чем-то несогласны или у вас есть предложения обращайтесь к модераторам в приват.
неужто у тебя так часто возникает ситуация при которой необходимо использовать эту функцию?
ну уж если она так тебе необходима, то создаешь модуль и выносишь туда свою функцию
это будет выглядеть так:
interface
uses Windows, Messages, Forms;
type
TFormHack=class(TForm)
end;
procedure ShowAndGo(z:TForm);
implementation
procedure ShowAndGo(z:TForm);
begin
MessageBox(0,PChar(TFormHack(z).FindNextControl(z.ActiveControl,true,true,false).Name),PChar(Application.Title),mb_ok);
TFormHack(z).FindNextControl(z.ActiveControl,true,true,false).SetFocus;
end;
end.
Новый модуль:
TAdvForm = class (TForm)
//... реализуем все методы, которые понадобятся в различных модулях
//... кроме методов можно еще много чего добавить ;)
end;
//...
Модуль проекта с формой:
TForm1 = class (TAdvForm) // Заменяем TForm на TAdvForm
//...
// теперь доступны все методы TAdvForm
end;
Так, на мой взгляд, более элегантно выглядит.
это будет выглядеть так:
interface
uses Windows, Messages, Forms;
type
TFormHack=class(TForm)
end;
procedure ShowAndGo(z:TForm);
implementation
procedure ShowAndGo(z:TForm);
begin
MessageBox(0,PChar(TFormHack(z).FindNextControl(z.ActiveControl,true,true,false).Name),PChar(Application.Title),mb_ok);
TFormHack(z).FindNextControl(z.ActiveControl,true,true,false).SetFocus;
end;
end.
Я попробовал, и этот способ кажется мне идеальным!!! Он не только работает, но и позволит использовать функцию в разных проектах без изменений. И в самом проекте только uses MyFunction добавить - и все!!! Именно этого я и хотел добиться.
Новый модуль:
TAdvForm = class (TForm)
//... реализуем все методы, которые понадобятся в различных модулях
//... кроме методов можно еще много чего добавить ;)
end;
//...
Модуль проекта с формой:
TForm1 = class (TAdvForm) // Заменяем TForm на TAdvForm
//...
// теперь доступны все методы TAdvForm
end;
Так, на мой взгляд, более элегантно выглядит.
А этот способ хоть и красивее, но где-нибудь через год когда функция неожиданно понадобится нужно будет не забыть в самом проекте добавить обьявление TAdvForm - а это уже лишнее. Кто как, а я буду вспоминать долго что именно нужно добавить, и куда...
if
переменная>10 и <20 //??????
Then
........................
это что такое?
насчет преременных, книжки читать надо :)
if (c>a)and(c<b) then // с между a и b
В приложении печать осуществляется, без использования стандартных диалогов, на принтер по умолчанию. Нужно сделать так, чтобы при установке галки в чекбоксе (к примеру) печать шла на другой принтер. В принципе я это сделал, но есть одна трабла: Если я снимаю эту галку, то печать по прежнему идет на другой принтер (не тот который изначально был принтером по умолчанию). И ка это забороть я не знаю. Может кто-нить помочь с вопросом?
Begin
DefPrn:= printer.Printers[printer.printerindex];
For PrnIdx:=0 to Printer.Printers.Count-1 do
Begin
Printer.PrinterIndex:=PrnIdx;
if Printer.Printers[Printer.PrinterIndex] = 'Datamax E-4203' then
frUpakList.ChangePrinter(PrnIdxOld,Printer.PrinterIndex);
//TPrn := Printer.Printers[Printer.PrinterIndex];
End;
{ IniFile :=TIniFile.Create('WIN.INI');
Try
IniFile.WriteString('windows','device',DefPrn +','+ TPrn);
Finally
IniFile.Free;
End;}
frTUpakList.PrintToDefault := True;
frTUpakList.Pages[0].pgOr := poLandscape;
frTUpakList.Dictionary.Variables['Termo'] := oqTmp.FieldByName('termo').AsInteger;
frTUpakList.Dictionary.Variables['TotalPlaces'] := LastPlace;
frTUpakList.PrepareReport;
frTUpakList.PrintPreparedReport('', 1, True, frAll);
{IniFile :=TIniFile.Create('WIN.INI');
Try
//IniFile.DeleteKey('device',DefPrn +','+ TPrn);
IniFile.WriteString('windows','device',DefPrn);
Finally
IniFile.Free;
End;}
End
Else
Begin
PrnIdxOld:= Printer.PrinterIndex;
DefPrn2:= printer.Printers[printer.printerindex];
For PrnIdx:=0 to Printer.Printers.Count-1 do
Begin
Printer.PrinterIndex:=PrnIdx;
if Printer.Printers[Printer.PrinterIndex] <> 'Datamax E-4203' then
frUpakList.ChangePrinter(PrnIdxOld,Printer.PrinterIndex);
End;
{ IniFile :=TIniFile.Create('WIN.INI');
Try
IniFile.WriteString('windows','device',TPrn);
Finally
IniFile.Free;
End;}
frUpakList.PrintToDefault := True;
frUpakList.Pages[0].pgOr := poLandscape;
frUpakList.Dictionary.Variables['Termo'] := oqTmp.FieldByName('termo').AsInteger;
frUpakList.Dictionary.Variables['TotalPlaces'] := LastPlace;
frUpakList.PrepareReport;
frUpakList.PrintPreparedReport('', 1, True, frAll);
End;
Это, код, который у меня есть на данный момент...
ОЧЕНЬ сложно. Используйтие АДО - подключается легко и работает как часы.
Как отловить нажатие Ctrl+Enter?
типа
IF KEY= <CTRL+Enter> then ... то-то и то-то ...
begin
//выполняем то, что нужно
end;
если отловить нажатие нужно везде, а не только в твоей программе, то надо использовать хуки(используй поиск по форуму, т.к. обсуждалось уже).
имеется путь к директории в которой находятся файлы (пример: С:\Папка). я пишу в обработчике:
findfirst(path1,faAnyFile, F); \\выполняю сам поиск
label5.Caption:=F.Name; \\ вывожу имя найденного файла в лабел
label6.Caption:=inttostr(F.Attr); \\ вывожу атрибуты найденного файла в лабел
в итоге он выводит в имени: имя директории
а в атрибутах: что это каталог (что собственно логически верно)
если добавлять маску для поиска: С:\Папка\*.* то он выводит имя: "." , а атрибуты в виде опять таки каталога
Но мне необходимо что бы он искал файлы расположенные в папке. Что я неправильно делаю?
вот строчка в которой это прописано:
вот строчка в которой это прописано:
нет код ищет все файлы, посмотри на маску и тип фалов, которые ищутся, а за тем выбираются те расширение которых соответствует параметру
1)сделать маску ввода на пароль. То биш, чтоб в поле Edit вместо вводимых цифр отображались звездочки или что-то в этом роде.
2)как организовать проверку на наличие в строке цифр или каких-либо символов, не относящихся к ФИО человека?
Если сможете. приведите фрагменты кода или подскажите, что почитать.
Спасибо.
2 цикл по символам и сравнение с множеством допустимых символов...
Можно использовать 2 обработчика TEdit: OnKeyPress и OnChange.
В OnKeyPress можно ограничить множество вводимых в TEdit символов, а в OnChange осуществить постпроверку уже введенной строки.
Например, следующий код позволяет вводить только цифры:
begin
if not (Key in ['0'..'9', #8]) then Key:=#0;
end;
Добавил метод формы, в этом методе выделяю память несколько раз с помощью функции GetMem. При выделении вываливается ошибка в библиотеке ntdll.dll (причем вываливается не на первом выделении памяти а на 3м) :mad:
Если поместить этот код в стандартный обработчик события формы (например, нажатие на кнопочку), то все работает правильно
Пробовал вместо GetMem использовать API шную функцию GlobalAlloc, та же фигня
var
AcctName: PChar;
DomainName:PChar;
dwAcctName:Cardinal;
dwDomainName:DWORD;
ProcHand: THandle;
TokenHand: THandle;
buffer:PTOKEN_USER;
bufsize:DWORD;
eUse :SID_NAME_USE;
begin
procHand:=OpenProcess(PROCESS_QUERY_INFORMATION, False, GetCurrentProcessId);
OpenProcessToken(ProcHand,TOKEN_READ,TokenHand);
GetTokenInformation(TokenHand,TokenUser,nil,0,bufsize);
buffer:=PTOKEN_USER(GlobalAlloc(GMEM_FIXED,100));
GetTokenInformation(TokenHand,TokenUser,buffer,bufsize,bufsize);
LookupAccountSid('',buffer^.User.Sid,AcctName,dwAcctName,DomainName,dwDomainName,eUse);
AcctName := PChar(GlobalAlloc(GMEM_FIXED,dwAcctName+1));
DomainName := PChar(GlobalAlloc(GMEM_FIXED,dwDomainName+1));
LookupAccountSid('',buffer^.User.Sid,AcctName,dwAcctName,DomainName,dwDomainName,eUse ) ;
Label1.Caption := AcctName;
Label2.Caption := DomainName;
GlobalFree(cardinal(buffer));
GlobalFree(cardinal(AcctName));
GlobalFree(cardinal(DomainName));
end;
А так вываливает ошибку EAccessViolation в модуле ntdll.dll при выполнении строчки AcctName := PChar(GlobalAlloc(GMEM_FIXED,dwAcctName+1));
var
AcctName: PChar;
DomainName:PChar;
dwAcctName:Cardinal;
dwDomainName:DWORD;
ProcHand: THandle;
TokenHand: THandle;
buffer:PTOKEN_USER;
bufsize:DWORD;
eUse :SID_NAME_USE;
begin
procHand:=OpenProcess(PROCESS_QUERY_INFORMATION, False, GetCurrentProcessId);
OpenProcessToken(ProcHand,TOKEN_READ,TokenHand);
GetTokenInformation(TokenHand,TokenUser,nil,0,bufsize);
buffer:=PTOKEN_USER(GlobalAlloc(GMEM_FIXED,100));
GetTokenInformation(TokenHand,TokenUser,buffer,bufsize,bufsize);
LookupAccountSid('',buffer^.User.Sid,AcctName,dwAcctName,DomainName,dwDomainName,eUse);
AcctName := PChar(GlobalAlloc(GMEM_FIXED,dwAcctName+1));
DomainName := PChar(GlobalAlloc(GMEM_FIXED,dwDomainName+1));
LookupAccountSid('',buffer^.User.Sid,AcctName,dwAcctName,DomainName,dwDomainName,eUse ) ;
acct_name := AcctName;
domain_name := DomainName;
GlobalFree(cardinal(buffer));
GlobalFree(cardinal(AcctName));
GlobalFree(cardinal(DomainName));
end;
З. Ы. Пишу на Delphi 7
Так он и так на другом работать должен, или скажи какая у тебя конкретно проблема.
Попробую свою программу на VMWare поставить, и посмотри что ей требуется. Если запустится без проблем, значит ничего не нужно :)
А ещё можно пойти к другу....)) Но это так к слову...
Единственное, что может понадобится это различные ADO, ODBC и другие машины, если они использованы при построении приложения, либо в редких случаях библиотеки DLL, но это бывает редко и обговорено в документации. Ну ещё конечно понадобятся те эллементы (файлы с данными, библиотеки, ресурсы и т.д.) которые уважаемый Bladrag у себя в приложении стал использовать... Но в любом случае наличае данных ресурсов определяет ПРАВИЛЬНУЮ работу программы, но приложение запустится в любом случае, другое дело, что оно может до кучи ошибок выдавать, если чего то не находит.
Возник такой вопрос как реализовать в компоненте функцию Undo / Redo,
но не таким образом!!!: TMyMemo.Undo;
необходимо чтоб эта была собственная реализация отмены / возврата.
Как этот процесс происходить? Для этого что необходимо использовать структру стек я правильно понимаю?
И еще функция Undo / Redo есть ограниченная и неограниченная, так ли это?
Что касается второго вопроса... Работа с прокси - это всего лишь еще один описанный протокол обмена данными между программами по сети
, так что ищи его описание и... изобретай велосипед ;)