Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Я начинающий, подскажите пожалуйста, как...

257
25 февраля 2007 года
kosfiz
1.6K / / 18.09.2005
Уважаемые участники!
Если вы только начинаете осваивать Delphi или считаете, что ваш вопрос простой для более опытных участников форума, то задавайте его здесь, не надо создавать для этого отдельные темы.

Если вы размещаете вопрос здесь, то , пожалуйста, прочтите следующее:
1. когда будете задавать свой вопрос, то делайте это нажимая на "ответ"(не путать с "быстрый ответ") и кратко указывайте в "заголовке" тему своего вопроса;
2. опишите чего вы хотели добиться.
3. если у вас возникла какая-то ошибка, и вы не знаете как её исправить, то обязательно приведите текст самой ошибки;
4. если это необходимо, приведите фрагмент вашего кода(ни в коем случае не надо писать весь код), также при добавлении кода пользуйтесь тегами([code ] и [ /code]);
5. укажите версию Delphi, которую используете и все настройки проекта;
6. если у вас возникли проблемы с нестандартными компонентами, то обязательно приведите ссылку, по которой их можно скачать.
7. соблюдайте правила форума

Удачи.
Модераторы форума Delphi & Kylix: Delpher, kosfiz & OlgaKr
Если вы с чем-то несогласны или у вас есть предложения обращайтесь к модераторам в приват.

1127 ответов / показаны 161 - 199

Страницы:
268
27 июня 2007 года
Михаил
587 / / 25.06.2005
FindNextControl объявлен в секции protected, следовательно он может быть вызван только из того модуля, где объявлен класс, поэтому нельзя вызвать его из экземпляра класса типа TForm. Решение передавать ссылку на следующий контрол, либо сделать заглушку, т.е унаследовать какой либо класс от TForm (допустим TFormHack) и привести параметр Self к TFormHack, тогда вызов TFormHack(Self) .FindNextControl будет разрешен
30K
27 июня 2007 года
Олег_gsvg
7 / / 25.06.2007
А именно ссылку на следующий control передаю, так работает. но в упор не нравится, поскольку часть необходимого для работы функции кода в нее не входит: нужно предварительно вызвать EindNextCnntrnl Как и в случае с созданием класса во многом теряется смысл написания функции - для ее использования нужны предварительные действия, через пол года уже и не вспомнишь какие.
268
27 июня 2007 года
Михаил
587 / / 25.06.2005
ну, вот опять все тебе не так :)
неужто у тебя так часто возникает ситуация при которой необходимо использовать эту функцию?
ну уж если она так тебе необходима, то создаешь модуль и выносишь туда свою функцию
30K
27 июня 2007 года
Олег_gsvg
7 / / 25.06.2007
Просто хотелось начать делать как в умных книжках советуют.. то есть писать код так, чтобы его удобно было повторно использовать:) В том числе и для модернизации чужих проектов, почему и свой компонент не кажется удачным тут изобретать. Но похоже что с этим я в не решаемую задачу уткнулся, придется оставить так.. хотя ситуация с проверкой введенных символов и передачей фокуса действительно часто встречается, почему и попробовал для нее функцию написать.. Спасибо за помощь, без вас я бы еще долго пытался обходной путь найти
268
28 июня 2007 года
Михаил
587 / / 25.06.2005
нуууу, нерешаемую задачу, нерешеаемых задач нет! было бы время желание и средства и все задачи станут решаемыми. Тебе необходимо создать отдельный модуль вынести туда свою процедуру или функцию, создать пустого наследника TForm и приводить ссылку на Self к данному классу, тогда можно будет использовать FindNextControl

это будет выглядеть так:
Код:
unit Unit2;

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.
303
28 июня 2007 года
makbeth
1.0K / / 25.11.2004
Олег_gsvg, есть еще вариант.
Новый модуль:
 
Код:
type
    TAdvForm = class (TForm)
        //... реализуем все методы, которые понадобятся в различных модулях
        //... кроме методов можно еще много чего добавить ;)
    end;
    //...

Модуль проекта с формой:
 
Код:
type
    TForm1 = class (TAdvForm) // Заменяем TForm на TAdvForm
        //...
        // теперь доступны все методы TAdvForm
    end;

Так, на мой взгляд, более элегантно выглядит.
30K
28 июня 2007 года
Олег_gsvg
7 / / 25.06.2007
Цитата: Михаил
нуууу, нерешаемую задачу, нерешеаемых задач нет! было бы время желание и средства и все задачи станут решаемыми. Тебе необходимо создать отдельный модуль вынести туда свою процедуру или функцию, создать пустого наследника TForm и приводить ссылку на Self к данному классу, тогда можно будет использовать FindNextControl

это будет выглядеть так:
Код:
unit Unit2;

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 добавить - и все!!! Именно этого я и хотел добиться.

Цитата: makbeth
Олег_gsvg, есть еще вариант.
Новый модуль:
 
Код:
type
    TAdvForm = class (TForm)
        //... реализуем все методы, которые понадобятся в различных модулях
        //... кроме методов можно еще много чего добавить ;)
    end;
    //...

Модуль проекта с формой:
 
Код:
type
    TForm1 = class (TAdvForm) // Заменяем TForm на TAdvForm
        //...
        // теперь доступны все методы TAdvForm
    end;

Так, на мой взгляд, более элегантно выглядит.



А этот способ хоть и красивее, но где-нибудь через год когда функция неожиданно понадобится нужно будет не забыть в самом проекте добавить обьявление TAdvForm - а это уже лишнее. Кто как, а я буду вспоминать долго что именно нужно добавить, и куда...

25K
28 июня 2007 года
DenisRip
12 / / 14.06.2007
У меня несколько стрингов на форме, как пользователю ими манипулировать?
25K
28 июня 2007 года
DenisRip
12 / / 14.06.2007
Например:
if
переменная>10 и <20 //??????
Then
........................
268
29 июня 2007 года
Михаил
587 / / 25.06.2005
Цитата: DenisRip
У меня несколько стрингов на форме, как пользователю ими манипулировать?


это что такое?

насчет преременных, книжки читать надо :)

 
Код:
var c:integer;

if (c>a)and(c<b) then // с между a и b
31K
02 июля 2007 года
SkifDS
2 / / 02.07.2007
Такая ситуация:
В приложении печать осуществляется, без использования стандартных диалогов, на принтер по умолчанию. Нужно сделать так, чтобы при установке галки в чекбоксе (к примеру) печать шла на другой принтер. В принципе я это сделал, но есть одна трабла: Если я снимаю эту галку, то печать по прежнему идет на другой принтер (не тот который изначально был принтером по умолчанию). И ка это забороть я не знаю. Может кто-нить помочь с вопросом?

Код:
If TmPrn.Checked = True Then
    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;


Это, код, который у меня есть на данный момент...
303
03 июля 2007 года
makbeth
1.0K / / 25.11.2004
SkifDS, устанавливай принтер для печати явно в любом случае.
31K
03 июля 2007 года
SkifDS
2 / / 02.07.2007
Да, но я не могу понять как это сделать. Можете подсказать или привести пример кода?
24K
03 июля 2007 года
ftana
16 / / 03.07.2007
Как настроит BDE администратор для Access?
309
04 июля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Как настроит BDE администратор для Access?


ОЧЕНЬ сложно. Используйтие АДО - подключается легко и работает как часы.

31K
06 июля 2007 года
whtblck
2 / / 06.07.2007
дык в этом собственно и вопрос:
Как отловить нажатие Ctrl+Enter?
типа
IF KEY= <CTRL+Enter> then ... то-то и то-то ...
257
06 июля 2007 года
kosfiz
1.6K / / 18.09.2005
если в своей программе, то надо в обработчике OnKeyDown написать следующее:
 
Код:
if (ssCtrl in Shift) and (Key = VK_RETURN) then
  begin
    //выполняем то, что нужно
  end;

если отловить нажатие нужно везде, а не только в твоей программе, то надо использовать хуки(используй поиск по форуму, т.к. обсуждалось уже).
31K
06 июля 2007 года
whtblck
2 / / 06.07.2007
пасипки, ща попробую...
12K
08 июля 2007 года
horror
26 / / 22.11.2006
Скажите пожалуйста, почему когда через делфи открываю Fast Reports, делаю любой отчет и запускаю программу на выполнение, то в Fast Reports не понимает русского языка в базе? (у меня появляются какие-то иероглифы)
2.0K
11 июля 2007 года
nevile
138 / / 05.01.2007
Проблема вот в чем:
имеется путь к директории в которой находятся файлы (пример: С:\Папка). я пишу в обработчике:

 
Код:
path1:=edit1.text; \\присваиваю переменной путь который расположен в эдите
findfirst(path1,faAnyFile, F); \\выполняю сам поиск
label5.Caption:=F.Name; \\ вывожу имя найденного файла в лабел
label6.Caption:=inttostr(F.Attr); \\ вывожу атрибуты найденного файла в лабел


в итоге он выводит в имени: имя директории
а в атрибутах: что это каталог (что собственно логически верно)

если добавлять маску для поиска: С:\Папка\*.* то он выводит имя: "." , а атрибуты в виде опять таки каталога

Но мне необходимо что бы он искал файлы расположенные в папке. Что я неправильно делаю?
257
11 июля 2007 года
kosfiz
1.6K / / 18.09.2005
тебе в FAQ для изучения тамошнего кода надо.
2.0K
13 июля 2007 года
nevile
138 / / 05.01.2007
Изучил код. Все понял, кроме того как мне найти абсолютно все файлы, а не только те которые удовлетворяют заданному расширению.
268
13 июля 2007 года
Михаил
587 / / 25.06.2005
пример показаный там и ищет все файлы
2.0K
13 июля 2007 года
nevile
138 / / 05.01.2007
нет он ищет файлы с расширением .htm
вот строчка в которой это прописано:
 
Код:
Label1.Caption := IntToStr(GetFileCount(Edit1.Text, '.htm'));
257
13 июля 2007 года
kosfiz
1.6K / / 18.09.2005
не то смотришь, надо вот это http://forum.codenet.ru/showpost.php?p=175784&postcount=3
268
14 июля 2007 года
Михаил
587 / / 25.06.2005
Цитата: nevile
нет он ищет файлы с расширением .htm
вот строчка в которой это прописано:
 
Код:
Label1.Caption := IntToStr(GetFileCount(Edit1.Text, '.htm'));


нет код ищет все файлы, посмотри на маску и тип фалов, которые ищутся, а за тем выбираются те расширение которых соответствует параметру

14K
31 июля 2007 года
Bladrag
50 / / 02.12.2006
Ребят, подскажите пожалуйста, как
1)сделать маску ввода на пароль. То биш, чтоб в поле Edit вместо вводимых цифр отображались звездочки или что-то в этом роде.
2)как организовать проверку на наличие в строке цифр или каких-либо символов, не относящихся к ФИО человека?
Если сможете. приведите фрагменты кода или подскажите, что почитать.
Спасибо.
26K
01 августа 2007 года
X-lord
14 / / 09.07.2007
1 Edit1.PasswordChar:='*';
2 цикл по символам и сравнение с множеством допустимых символов...
303
01 августа 2007 года
makbeth
1.0K / / 25.11.2004
Bladrag, второй вопрос - классика :)
Можно использовать 2 обработчика TEdit: OnKeyPress и OnChange.
В OnKeyPress можно ограничить множество вводимых в TEdit символов, а в OnChange осуществить постпроверку уже введенной строки.
Например, следующий код позволяет вводить только цифры:
 
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if not (Key in ['0'..'9', #8]) then Key:=#0;
end;
21K
03 августа 2007 года
alex_kart
14 / / 17.03.2007
Подскажите пожалуйста, в чем проблема.
Добавил метод формы, в этом методе выделяю память несколько раз с помощью функции GetMem. При выделении вываливается ошибка в библиотеке ntdll.dll (причем вываливается не на первом выделении памяти а на 3м) :mad:
Если поместить этот код в стандартный обработчик события формы (например, нажатие на кнопочку), то все работает правильно
Пробовал вместо GetMem использовать API шную функцию GlobalAlloc, та же фигня
303
03 августа 2007 года
makbeth
1.0K / / 25.11.2004
alex_kart, код в студию.
21K
03 августа 2007 года
alex_kart
14 / / 17.03.2007
Так работает
Код:
procedure TForm1.Button1Click(Sender: TObject);
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));
Код:
procedure TForm1.get_username(var acct_name :string; var domain_name :string);
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
14K
03 августа 2007 года
Bladrag
50 / / 02.12.2006
Такой вопросик: как обеспечить переносимость exe-шника, то бишь чтобы откомпилированный файл работал на любом компе, а не ток на моем:)
286
03 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: Bladrag
Такой вопросик: как обеспечить переносимость exe-шника, то бишь чтобы откомпилированный файл работал на любом компе, а не ток на моем:)


Так он и так на другом работать должен, или скажи какая у тебя конкретно проблема.

31K
06 августа 2007 года
SiNiK
2 / / 06.08.2007
Цитата: Bladrag
Такой вопросик: как обеспечить переносимость exe-шника, то бишь чтобы откомпилированный файл работал на любом компе, а не ток на моем:)



Попробую свою программу на VMWare поставить, и посмотри что ей требуется. Если запустится без проблем, значит ничего не нужно :)

286
06 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: SiNiK
Попробую свою программу на VMWare поставить, и посмотри что ей требуется. Если запустится без проблем, значит ничего не нужно :)



А ещё можно пойти к другу....)) Но это так к слову...

Единственное, что может понадобится это различные ADO, ODBC и другие машины, если они использованы при построении приложения, либо в редких случаях библиотеки DLL, но это бывает редко и обговорено в документации. Ну ещё конечно понадобятся те эллементы (файлы с данными, библиотеки, ресурсы и т.д.) которые уважаемый Bladrag у себя в приложении стал использовать... Но в любом случае наличае данных ресурсов определяет ПРАВИЛЬНУЮ работу программы, но приложение запустится в любом случае, другое дело, что оно может до кучи ошибок выдавать, если чего то не находит.

14K
07 августа 2007 года
Bladrag
50 / / 02.12.2006
блин, я знал, что это глюкнутый комп был. приложение у меня простецкое было, никакие серьезные библиотеки не требовались. там Explorer ошибку выдавал. типа неизвестное приложение и все такое.
24K
07 августа 2007 года
DerecWandel
2 / / 25.12.2006
Имееться компонента TMyMemo, которая унаследована от TMemo
Возник такой вопрос как реализовать в компоненте функцию Undo / Redo,
но не таким образом!!!: TMyMemo.Undo;
необходимо чтоб эта была собственная реализация отмены / возврата.

Как этот процесс происходить? Для этого что необходимо использовать структру стек я правильно понимаю?

И еще функция Undo / Redo есть ограниченная и неограниченная, так ли это?
16K
08 августа 2007 года
Zbyszek
118 / / 08.08.2007
Извиняюсь, возможно, данный вопрос уже поднимался, и возможно, пишу не в ту тему, но. Проблема в следующем: нужно загрузить на диск/в память файл по http, причём сделать это хотелось бы не через функции wininet.dll или urlmon.dll, так как добиваюсь максимальной скорости, пишу на Delphi 7 без VCL, на WinAPI. Но обязательно ли будут эти библиотеки на целевом PC?! Так же хотелось бы дать пользователю возможность соединения через прокси. Понимаю, что намного проще не изобретать велосипед, а пользоваться готовыми АПИ, но может быть, Вы всё же что-нибудь посоветуете…
303
09 августа 2007 года
makbeth
1.0K / / 25.11.2004
Zbyszek, не совсем понял, о каких именно библиотеках идет речь, но полагаю, что если ты используешь WinAPI, то скорее всего пользуешься стандартыми DLL для работы с Windows Sockets. Эти библиотеки есть на любой машине.
Что касается второго вопроса... Работа с прокси - это всего лишь еще один описанный протокол обмена данными между программами по сети
, так что ищи его описание и... изобретай велосипед ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог