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

Статус
В этой теме нельзя размещать новые ответы.

David.D.Rocco

Участник
Проверенный
Кто знает есть такая функция CallBackAddr в delphi?
она там не нужна. для вызыва функции ставь stdcall и все.
например
Код:
function EnumWindowsProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
begin
...
end;
..
EnumChildWindows(handle, @EnumWindowsProc, 0);
 

Avangard

Участник
Можно ли получить имя компонента чужого окна, зная его handle? Именно имя, не класс.
 

LexBell

Борода
Супер модератор
Добрый день. Заранее прошу прощения за нубскую просьбу, но вот не делал никогда, и примеров не нашел.
Нужно сделать компоненту, производную от TPageControl, которая на своих TTabSheet содержит TRichEdit с включеным свойством align := alclient;.
То-есть, создаешь TTabSheet а там уже свой TRichEdit во весь TTabSheet. Может кто-нибудь сделать и откоментировать, пожалуйста?
 

GVS276

Старожил
Проверенный
Gnom, Пример
ЗЫ: Скомпилешь и нажмешь на кнопку и увидишь свой нужный результат!
 

GVS276

Старожил
Проверенный
Парни, такой вопрос, у меня в проекте используются две формы: Form1 и Form2
Теперь к вопросу: как сделать, чтобы Form2 была позади Form1, чтобы она не перекрывала Form1 при клике на нее (Form2)?
Я конечно делал по другому, но у меня происходили мерцания так как я не давал возможно Form2 сделаться активной, заметил что в Inno Setup MainForm находится позади WizardForm и при клики на MainForm она не становится активной.
 

LexBell

Борода
Супер модератор
AVMan, во первых - в Inno MainForm является родителем WizardForm, посмотри в исходниках - там должен быть ответ на твой вопрос. Можно попробовать стиль noactivate (не ручаюсь за орфографию :) ) для заднего окна. Переназначать родителя для окна WizardForm не советую - будет очень криво.
 

GVS276

Старожил
Проверенный
Gnom, Ага, блин забыл про обработчик OnActivate, теперь нет мерцаний, спс
Код выглядет как то так:
[SOURCE="iss"]procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.OnActivate:= FormActivate;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Form1.Show;
end;[/SOURCE]
 

Hachapury

Участник
появился у меня один вопрос. пишу простенькую программку для хранения паролей, логинов и дополнительной информации для сайтов и тут столкнулся с проблемой. вся информация сохраняется путем добавления строк в 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;
скрин программы
может кто сможет помочь.
PS: знаю что код корявый, но что поделать, только учусь :)
 

Shegorat

Lord of Madness
Администратор
и код загрузки, который не работает:
А почему он должен работать? Ведь ты не заполняешь свой 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;
 

Hachapury

Участник
Shegorat, ну работает, но у меня ругается на эту строку
Код:
cmtext:= [COLOR="Red"][B][U]RemoveQuotes[/U][/B][/COLOR](Trim(Copy(tmp, 1, k-1)));
но если убрать RemoveQuotes оно открывает, хоть и с офыбкой
 

Pirate

Новичок
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;
 

Pirate

Новичок
Столкнулся с одной проблемой при парсинге сайтов. Если кодировка у страницы сайта 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: Разобрался
 
Последнее редактирование:

LexBell

Борода
Супер модератор
На семерке при нажатии сочетания Ctrl-Alt-Del появляется окно - сменить пользователя, диспечер задач, еще какие-то пункты.
Вопрос - какое сообщение проходит, при появлении этого окна? Как его поймать?
P.S. сообщения WM_QUERYENDSESSION, WM_ENDSESSION, WM_USERCHANGED - не то, полноценного выхода пользователя не происходит, соответственно этих сообщений еще нет.
 

deaddima

Новичок
Ребят недавно написал библиотеку для программного управления вордом
Использовал неявную загрузку модуля...В принципе всё работает однако после закрытия,прога выдает ошибки типа
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.
 
Последнее редактирование:

LexBell

Борода
Супер модератор
Нужен код длл. Навскидку - забываешь что-то выгрузить при выходе. Точнее - вообще не выгружаешь - в длл создай процедуру деинициализации и там аккуратно разрушай все, что создаешь в CreateWord.
 

deaddima

Новичок
Вот 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 нет проблем...
 

LexBell

Борода
Супер модератор
W:=CreateOleObject('Word.Application');
Ты создаешь Объект и нигде его не разрушаешь. а исходя из того, что он подключается к твоему приложению, а твое приложение подключается к третьему приложению... в общем при выходе начинаются попытки закрыть объекты, которые уже не существуют... если грубо - напиши в дллку процедуру такого содержания :
Код:
W:= nil;
и вызывай ее при выходе из приложения. запросто может помочь.
 
Последнее редактирование:

deaddima

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