Вопросы и решения

  • Автор темы Автор темы LexBell
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
Кто знает есть такая функция CallBackAddr в delphi?
она там не нужна. для вызыва функции ставь stdcall и все.
например
Код:
function EnumWindowsProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
begin
...
end;
..
EnumChildWindows(handle, @EnumWindowsProc, 0);
 
Можно ли получить имя компонента чужого окна, зная его handle? Именно имя, не класс.
 
Добрый день. Заранее прошу прощения за нубскую просьбу, но вот не делал никогда, и примеров не нашел.
Нужно сделать компоненту, производную от TPageControl, которая на своих TTabSheet содержит TRichEdit с включеным свойством align := alclient;.
То-есть, создаешь TTabSheet а там уже свой TRichEdit во весь TTabSheet. Может кто-нибудь сделать и откоментировать, пожалуйста?
 
Gnom, Пример
ЗЫ: Скомпилешь и нажмешь на кнопку и увидишь свой нужный результат!
 
Парни, такой вопрос, у меня в проекте используются две формы: Form1 и Form2
Теперь к вопросу: как сделать, чтобы Form2 была позади Form1, чтобы она не перекрывала Form1 при клике на нее (Form2)?
Я конечно делал по другому, но у меня происходили мерцания так как я не давал возможно Form2 сделаться активной, заметил что в Inno Setup MainForm находится позади WizardForm и при клики на MainForm она не становится активной.
 
AVMan, во первых - в Inno MainForm является родителем WizardForm, посмотри в исходниках - там должен быть ответ на твой вопрос. Можно попробовать стиль noactivate (не ручаюсь за орфографию :) ) для заднего окна. Переназначать родителя для окна WizardForm не советую - будет очень криво.
 
Gnom, Ага, блин забыл про обработчик OnActivate, теперь нет мерцаний, спс
Код выглядет как то так:
[SOURCE="iss"]procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.OnActivate:= FormActivate;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Form1.Show;
end;[/SOURCE]
 
появился у меня один вопрос. пишу простенькую программку для хранения паролей, логинов и дополнительной информации для сайтов и тут столкнулся с проблемой. вся информация сохраняется путем добавления строк в listview в стиле vsReport. сохранять пароли то сохраняет в текстовый файлик, а вот обратно загрузить не хочет.

код сохранения
Код:
procedure TForm2.N5Click(Sender: TObject);
var
S : TStringList;
i: integer;
begin
if SaveDialog1.Execute then
S := TStringList.Create;
  for i := 0 to ListView1.Items.Count-1 do
  S.Add('"'+ ListView1.Items[i].Caption +'",'+ ListView1.Items[i].SubItems.CommaText);
  S.SaveToFile(SaveDialog1.FileName);
  S.Free;
end;
и код загрузки, который не работает:
Код:
procedure TForm2.N3Click(Sender: TObject);
var
S: TStringList;
I: integer;
begin
if OpenDialog1.Execute then
S := TStringList.Create;
  for i := 0 to ListView1.Items.Count-1 do
  S.Add('"'+ ListView1.Items[i].Caption +'",'+ ListView1.Items[i].SubItems.CommaText);
  S.LoadFromFile(OpenDialog1.FileName);
  S.Free;
end;
скрин программы
n5ufspt2lhjv.jpg
может кто сможет помочь.
PS: знаю что код корявый, но что поделать, только учусь :)
 
и код загрузки, который не работает:
А почему он должен работать? Ведь ты не заполняешь свой ListView1.
Вот примерный код, писал на коленке и не проверял, но основная мысль думаю будет понятна.
Код:
procedure TForm2.N3Click(Sender: TObject);
var
S: TStringList;
I, k: integer;
li: TListItem;
tmp, cmtext: string;
begin
  if OpenDialog1.Execute then begin
    S := TStringList.Create;
    S.LoadFromFile(OpenDialog1.FileName);    
    for i := 0 to ListView1.Items.Count-1 do begin
      tmp:= S.Strings[i];
      k:= Pos(',', tmp);
      cmtext:= RemoveQuotes(Trim(Copy(tmp, 1, k-1)));
      Delete(tmp, 1, k);
      li:= ListView1.Items.Add;
      li.Caption:= cmtext;
      li.SubItems.CommaText:= Trim(tmp);
    end;
    S.Free;
  end;  
end;
 
Shegorat, ну работает, но у меня ругается на эту строку
Код:
cmtext:= [COLOR="Red"][B][U]RemoveQuotes[/U][/B][/COLOR](Trim(Copy(tmp, 1, k-1)));
но если убрать RemoveQuotes оно открывает, хоть и с офыбкой
 
Hachapury, Вот так попробуй:
Код:
procedure TForm2.N3Click(Sender: TObject);
var
S: TStringList;
I, k: integer;
li: TListItem;
tmp, cmtext: string;
begin
try
  if OpenDialog1.Execute then begin
    S := TStringList.Create;
    S.LoadFromFile(OpenDialog1.FileName);
    for i:= 0 to S.Count do begin
      tmp:= S.Strings[i];
      k:= Pos(',', tmp);
      cmtext:= Trim(Copy(tmp, 1, k - 1));
      cmtext:= StringReplace(cmtext, '"', '', [rfReplaceAll, rfIgnoreCase]);
      Delete(tmp, 1, k);
      li:= ListView1.Items.Add;
      li.Caption:= cmtext;
      li.SubItems.CommaText:= Trim(tmp);
    end;
    S.Free;
  end;
except end;
end;
Код:
procedure TForm2.N5Click(Sender: TObject);
var
S : TStringList;
i: integer;
begin
if (SaveDialog1.Execute) and (Length(SaveDialog1.FileName) > 0) then begin
S := TStringList.Create;
  for i := 0 to ListView1.Items.Count-1 do
  S.Add('"'+ ListView1.Items[i].Caption +'",'+ ListView1.Items[i].SubItems.CommaText);
  S.SaveToFile(SaveDialog1.FileName);
  S.Free;
end;
end;
 
Столкнулся с одной проблемой при парсинге сайтов. Если кодировка у страницы сайта UTF-8, то в исходнике, вместо русских букв, появляются знаки вопросов. Вот код:
Код:
function GetSourceHtml(URL: AnsiString): AnsiString;
var
  idHttp1: TIdHttp;
begin
  idHttp1:= TIdHttp.Create(Form1);
  if Pos('http://', URL) = 0 then URL:= 'http://' + URL;
  Result:= idHttp1.Get(URL);
end;

procedure Parse(URL: AnsiString);
begin
  Form1.Memo1.Clear;
  Source:= GetSourceHtml(URL);
  Form1.Memo1.Lines.Add(Source);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Parse(Edit1.Text);
end;

Пытался кодировать исходник из UTF-8 в Ansi (ф-я cp1251ToAnsi), знаки вопросов не исчезают. Компилятор Delphi XE2 Upd4. Выручайте :-[

UPD: Разобрался
 
Последнее редактирование:
На семерке при нажатии сочетания Ctrl-Alt-Del появляется окно - сменить пользователя, диспечер задач, еще какие-то пункты.
Вопрос - какое сообщение проходит, при появлении этого окна? Как его поймать?
P.S. сообщения WM_QUERYENDSESSION, WM_ENDSESSION, WM_USERCHANGED - не то, полноценного выхода пользователя не происходит, соответственно этих сообщений еще нет.
 
Ребят недавно написал библиотеку для программного управления вордом
Использовал неявную загрузку модуля...В принципе всё работает однако после закрытия,прога выдает ошибки типа
Runtime error 216 at 00BE24C6E
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

     private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
Function CreateWord:boolean;stdcall;
    external 'Project1.dll' name 'CreateWord';

procedure TForm1.Button1Click(Sender: TObject);
begin
CreateWord;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CreateWord;
end;

end.

 
Последнее редактирование:
Нужен код длл. Навскидку - забываешь что-то выгрузить при выходе. Точнее - вообще не выгружаешь - в длл создай процедуру деинициализации и там аккуратно разрушай все, что создаешь в CreateWord.
 
Вот dll
Код:
library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  System.SysUtils,
  System.Classes,
  comObj,Windows;

{$R *.res}
var W:variant;
    CreatedWord:boolean;
Function CreateWord:boolean;stdcall;
begin
CreateWord:=true;
CreatedWord:=true;
try
W:=CreateOleObject('Word.Application');
except
CreateWord:=false;
CreatedWord:=false;
end;

end;
exports CreateWord;
begin
end.
Ты говоришь создать процедуру деинициализации....а чего dll?
Я знаю была у меня где-то процедура для закрытия dll но она для явной загрузки и то в главном юните
На счёт закрытия word'a нет проблем...
 
W:=CreateOleObject('Word.Application');
Ты создаешь Объект и нигде его не разрушаешь. а исходя из того, что он подключается к твоему приложению, а твое приложение подключается к третьему приложению... в общем при выходе начинаются попытки закрыть объекты, которые уже не существуют... если грубо - напиши в дллку процедуру такого содержания :
Код:
W:= nil;
и вызывай ее при выходе из приложения. запросто может помочь.
 
Последнее редактирование:
Gnom, Вобщем начал я писать процедуру на закрытия ворда
состоит из 2 строк
W.Quit;
W:=UnAssigned;

При компеляции бьет ошибку [DCC Error] Unit2.pas(28): E2003 Undeclared identifier: 'UnAssigned'
Если писать без dll т.е. в главном юните то ошибка изчезает
у автора тоже идет эта ошибка однако он как-то откомпелировал dll
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху