ورود

View Full Version : انتقال متغيير به word



mohsen_r
پنج شنبه 17 دی 1388, 11:52 صبح
با سلام
من ميخوام از داخل دلفي يكسري متغيير را به داخل صفحه word كه باز است (در جاي مشخص ) انتقال بدم آيا امكان آن وجود دارد
توضيح اينكه يك سيستم اتوماسيون در اداره نصب شده كه نامه هاي قلبي كه توسط برنامه ها از ديتابيس خوانده مي شد ديگر كاراي ندارد و بايد نامه دستي تايپ شود البته من گزارش را به صورت word اكسپورت مي كنم و نامه را كپي ميكنند داخل صفحه ورد اتوماسيون
با تشكر
(در ضمن گشتيم پيدا نكرديم)

علی رضائی
شنبه 19 دی 1388, 09:15 صبح
لينك زير مربوط به وي بي است ولي شايد بدرد بخورد.
http://forum.iranled.com/showthread.php?tid=11237

mohsen_r
دوشنبه 21 دی 1388, 13:38 عصر
سوال ما اشكال داره يا جوابي نداره ما منتظر لطف دوستانيم

سعید صابری
دوشنبه 21 دی 1388, 14:29 عصر
شاید این بدردت بخوره
البته اين روش سختشه


type
TMessageList = class(TList);

var
Form1: TForm1;
MessageList: TMessageList = nil;
MessageBuffer: TEventMsg;
HookHandle: hHook = 0;
MessageCount: Word = 0;
Go: Boolean = False;

implementation

{$R *.DFM}

procedure Stop;
begin
if Go then UnHookWindowsHookEx(HookHandle);
MessageList.Free;
Go:=False;
end;

function FBack(Code: Integer; wParam, lParam: LongInt): LongInt; stdcall;
begin
case Code of
HC_SKIP:
begin
Inc(MessageCount);
if MessageCount>=MessageList.Count then Stop
else MessageBuffer:=TEventMsg(MessageList.Items[MessageCount]^);
Result:=0;
end;
HC_GETNEXT:
begin
PEventMsg(lParam)^:=MessageBuffer;
Result:=0;
end
else
Result:=CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
end;

procedure SetHook;
begin
MessageBuffer:=TEventMsg(MessageList.Items[0]^);
MessageCount:=0;
HookHandle:=SetWindowsHookEx(WH_JOURNALPLAYBACK, FBack, hInstance, 0);
Go:=True;
end;

procedure MakeMessage(Key: byte; Mes: Cardinal);
var
MyEvent: PEventMsg;
begin
New(MyEvent);
with MyEvent^ do
begin
message:=Mes;
ParamL:=Key;
ParamH:=MapVirtualKey(Key, 0);
Time:=GetTickCount;
hWnd:=Form1.Handle;
end;
MessageList.Add(MyEvent);
end;

procedure Imitation(KeyCode: Word);
begin
MakeMessage(Lo(KeyCode), WM_KEYDOWN);
MakeMessage(Lo(KeyCode), WM_KEYUP);
end;

procedure SetMessages(S: string);
var
i: Integer;
KeyCode: Word;
begin
i:=1;
repeat
KeyCode:=vkKeyScan(S[i]);
Imitation(KeyCode); // simulate key presses
Inc(i);
until i>Length(S);
end;

function SendStr(S: string): Integer;
begin
try
MessageList:=TMessageList.Create;
SetMessages(S); // set messages
SetHook; // set hook
except
end;
Result:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Handle: hWnd;
ProcessInfo: TProcessInformation;
StartInfo: TStartUpInfo;
APath: string;
begin
APath:=Edit1.Text;
if CreateProcess(
nil,
PChar(APath),
nil,
nil,
False,
0,
nil,
nil,
StartInfo,
ProcessInfo) then
begin
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
Handle:=FindWindow('winword', nil);
SetForegroundWindow(Handle);
SendStr('hello');
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
end;

mohsen_r
سه شنبه 22 دی 1388, 11:29 صبح
با تشكر ولي هيچ عكس العملي نشان نداد و چيزي ارسال نشد

سعید صابری
سه شنبه 22 دی 1388, 12:22 عصر
این دیگه 100% تست شده.


var
WordApplication, WordDocument: Variant;
begin
WordApplication := CreateOleObject('Word.Application') ;
WordDocument := WordApplication.Documents.Add;
WordApplication.Selection.TypeText('XXXXXXXXXXXYYY YYYYYY') ;
WordDocument.SaveAs(FileName := 'C:\A.Doc',
AddToRecentFiles := False) ;
WordApplication.Quit(False)
end;

mohsen_r
سه شنبه 22 دی 1388, 13:47 عصر
شرمنده من زياد تخصص ندارم ولي CreateOleObject ايراد ميگره و نمي شناسه چيز خاصي بايد رو صفحه بزارم

سعید صابری
سه شنبه 22 دی 1388, 14:37 عصر
شرمنده فراموش كرده بودم اسم يونيتش بزارم.


uses comobj

mohsen_r
چهارشنبه 23 دی 1388, 07:21 صبح
این دیگه 100% تست شده.


var
WordApplication, WordDocument: Variant;
begin
WordApplication := CreateOleObject('Word.Application') ;
WordDocument := WordApplication.Documents.Add;
WordApplication.Selection.TypeText('XXXXXXXXXXXYYY YYYYYY') ;
WordDocument.SaveAs(FileName := 'C:\A.Doc',
AddToRecentFiles := False) ;
WordApplication.Quit(False)
end;



بازم شرمنده كوتاه و جالب بود ولي همانطور كه گفتم من مي خوام صفحه word كه باز هست انتقال پيداكنه نه يكي بسازه

khoshblagh
چهارشنبه 23 دی 1388, 07:31 صبح
با سلام خدمت دوستان ظاهرا کد مشکل دارد!

سعید صابری
چهارشنبه 23 دی 1388, 07:41 صبح
بيش از 10 بار امتحان كردم. كد راهم ضميمه مي كنم. در ضمن فكر كنم office روي كامپيوتر شما نصب نباشه. چون در اين شيوه به احتمال زياد نرم افزار ورد بايد نصب شده باشه

mohsen_r
چهارشنبه 23 دی 1388, 08:09 صبح
بیش از 10 بار امتحان کردم. کد راهم ضمیمه می کنم. در ضمن فکر کنم office روی کامپیوتر شما نصب نباشه. چون در این شیوه به احتمال زیاد نرم افزار ورد باید نصب شده باشه

سوتفاهم شد برنامه شما کار کرد ولی سوال من در مورد صفحه باز word بود
مثل این


procedure TForm1.Button1Click(Sender: TObject);
var
wnd: HWND;
i: Integer;
s: string;
begin
wnd := FindWindow('notepad', nil);
if wnd <> 0 then
begin
wnd := FindWindowEx(wnd, 0, 'Edit', nil);

// äæÔÊä ãÊä ÏÑ notepad.
s := 'Hello';
for i := 1 to Length(s) do
SendMessage(wnd, WM_CHAR, Word(s[i]), 0);

PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);

PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
end;
end;


که متن را در notpad باز منتقل میکنه