בית
Top.Mail.Ru Yandeks.Metrika
פורום: "ראשי";
ארכיון נוכחי: 2002.01.08;
הורדה: [xml.tar.bz2];

למטה

תתקשר בחזרה מצא סניפים דומים


Eugene Zelikovsky   (2001-12-14 13:58) [0]

אנשים בבקשה הסבירו כיצד לעבוד עם CallBack.
תקשורת Dll עם התוכנית.
אם אתה יכול לחתוך את הקוד.
תודה!



Eugene Zelikovsky   (2001-12-14 14:52) [1]

עזרה !!!!!



Digitman   (2001-12-14 14:54) [2]

ובכן, כבר נתתי לך קטע שממחיש כיצד לחבר את מטפל האירועים שלך לרכיב שנוצר ב- DLL! איך אתה אוהב שמטפל באירועים לא מתקשר?



Eugene Zelikovsky   (2001-12-14 16:09) [3]

לא, העצה שלך לא עבדה: (... EventHendlr לא תעבוד .... אולי בכל זאת אותו דבר לגבי CallBack ותגיד לי ...



Digitman   (2001-12-14 16:14) [4]

וזה CallBack !!!!!!!!!!!!!!!!!!!!!!
העובדה שיש לך משהו "שלא מועבר" איפשהו היא אי הבנתך במנגנון הקצאת מטפלים באירועים. ובדיוק בזה. ואתה מייד - "לא מועברים"))))))))))) כן, הכל נפלא מועבר!)) חפש טעות בבית.



Eugene Zelikovsky   (2001-12-14 16:22) [5]

Upss ....
אוקיי, יש לי את זה ... :) התקשרות חוזרת ... אוקיי ... אז השאלה!
מה כתבת אז .... על החלק dll שהבנתי .. כן זה עובד נכון .... הוא שולח כתובת לאירוע הנדלר .... אוקיי
אבל הנה תקלה עם התוכנית ... לפרטים נוספים? מה שכתבת ... לא תופס את EventHendler .... אני מודה שלא הבנתי אפילו מה אנחנו עושים בתוכנית .....



Digitman   (2001-12-14 16:27) [6]

באיזו תוכנית? גם DLL וגם EXE הם תוכניות. השתמש, למשל, במונחים כמו "קוד קורא" ו"קוד קורא ". אחרת - לא דבר ארור ברור על מה אתה מדבר ....



Eugene Zelikovsky   (2001-12-14 16:35) [7]

אוקיי :)
אבל עם קוד השיחה, תקלה ... האם אוכל למסור לך פרטים נוספים? מה שכתבת ... לא תופס את EventHendler .... אני מודה שלא הבנתי אפילו מה אנחנו עושים בזה. .....
והאם חובה למשוך את Socket ... בקוד השיחה?



Digitman   (2001-12-14 16:54) [8]

מה המשמעות של "למשוך"? כמה זמן אנו מדברים בטיפשות בעגה ????

ה- TSocketServer שיצרת ב- DLL מודיע לך בפרמטר Socket של אירוע OnClientRead על איזה לקוח מסוים שלח לך את חבילת הנתונים.



Digitman   (2001-12-14 16:56) [9]

הביאו את קטע הקוד השבורים שלכם לכאורה - אני אגיב היכן אתם עושים מה באופן ספציפי. ובכן, איך אתה מסביר על האצבעות?



Eugene Zelikovsky   (2001-12-14 17:35) [10]

הנה מה שכתבתי ב- DLL:
procedure ClientRead(servers: TServerSocket; EventHandler: TSocketNotifyEvent);export;
begin
ServerS.OnClientRead:= EventHandler;
end;

באתגר קוד:

Type
TForm1 = class(TForm)
Memo1: TMemo;
procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);


procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
memo1.lines.Insert(0,Socket.ReceiveText);
end;




ומה עוד נועד:

SetOnClientRead (ServerSocketInstanceCreatedInDll, MyObjectInstance.OnClientRead);



petr_v_a   (2001-12-14 18:32) [11]

אם אני מבין נכון מה אתה צריך:

ב exe

נוהל MyCallBackregister (proc: pointer); חיצוני "mylib.dll";

פונקציה cbak (מידע: מצביע)
להתחיל
showmessage ("אופס!");
הסוף;

/ * איפשהו על האתחול * /
MyCallackRegister (@cbak);

ב - DLL

סוג
TMyCallBackProc = נוהל (מידע: מצביע);
היה
CbakAddr: TMyCallBackProc;
..........

נוהל MyCallackRegister (addr: TMyCallBackProc); // ואל תשכחו לייצא אותו
להתחיל
CbakAddr: = addr;
הסוף;

......................
/ * וזה מטפל באירועים * /
נוהל Datamodule1PosleAtomnoiVoiny (שולח: TTerrorist);
להתחיל
CbackAddr (שולח);
הסוף;

!!! כתבתי ממש כאן, אולי איפה שהחוט, חוט הצ'י לא צומח יחד, אבל הרעיון לא סובל מכך



Eugene Zelikovsky   (2001-12-14 20:01) [12]

> petr_v_a
הכל בסדר ... רק הגרזנים שלוולישון חלו על ...

שאלה רעה
למה התכוונת

function Cbak( info:pointer)
begin
showmessage("oops!");
end;


איפה זה לא סיים ... איזו פונקציה .... אבל זה כל כך תקלה ..
ואיך להפחיד את הגישות האלה ממש?
אני לא יודע מה לחשוב ...
התוכנית מתכופפת ברגע דומה לזה בקוד שלך ... CbakAddr:=addr;



Anatoly Podgoretsky   (2001-12-14 20:19) [13]

כן, גש voleyshon zadolbali :-)



petr_v_a   (2001-12-14 20:35) [14]

> יוג'ין זליקובסקי
והזהרתי :) אני את הרעיון נטוע שהכל נמצא קוד נכון, אני לא עונה.



y-soft   (2001-12-14 21:34) [15]

> יוג'ין זליקובסקי ©
אינך יכול להשתמש בשיטה כפונקציות התקשרות חוזרת, אלא להעביר כפרמטר קישור נפרד לאובייקט המתקשר ולכתובת של פונקציית המתאם הליניארי. עדיף אפילו להשתמש בכנס ה- stdcall לעבודה עם Dll (נגיע לתאימות טובה יותר עם כלי פיתוח אחרים). לדוגמה, ככה (רק גישה כללית):

סוג
TMyCallback = נוהל (סימוכין: מצביע); stdcall; // נוהל מתאם התקשרות

נוהל מיוצא:

נוהל SomeProc (סימוכין: מצביע; MyCbk: TMyCallback); stdcall;

קרא לה כך:

הליך TMyObject.CallSomeProc;
להתחיל
SomeProc (עצמי, @ MyCallback);
הסוף;

נוהל TMyObject.SomeMethod;
להתחיל
// קצת פעולה
הסוף;

מטפל בהליך התקשרות חוזרת:

נוהל MyCallback (סימוכין: מצביע); stdcall;
להתחיל
TMyObject (הפניה). SumMethod;
הסוף;

אולי תאהב את האפשרות הזו יותר :)



petr_v_a   (2001-12-14 21:49) [16]

> y- רך
אבל "פונקציות ההתקשרות של השיטה אינן רק" לא ניתן ולא להשתמש בהן ", ואם אתה משתמש בה, אז האביזר מובטח



Eugene Zelikovsky   (2001-12-14 23:14) [17]

> petr_v_a
באופן כללי, הכנתי את השיטה שהצעת לעבוד .... אבל רק פעם אחת ... אז לא אכפת לו ... לא מגיב ...
> y- רך
לא הבנתי את השיטה שלך
למה התכוונת:
procedure MyCallback(Reference : pointer); stdcall;
begin
--- TMyObject(Reference).SomeMethod; ---//вот здесь
end;



iZEN   (2001-12-14 23:36) [18]

עבודה עם DLL בספר פחות או יותר הגון על דלפי מתואר.
קניתי ספר, קראתי אותו, הבנתי (זה הכרחי!).

ולמה אנחנו מדברים ונטיעות כאן גנים?

נ.ב. אדם לא יודע לעבוד עם DLL - תן לו ללמוד ואז הוא כבר חושב אם שווה למלא שם שקעים.



Eugene Zelikovsky   (2001-12-14 23:52) [19]

> IZEN
בספר לא פחות הגון, עבודה עם DLL מתוארת כמו:
אתה יכול לשים את הפונקציה כן שתספור אותך 2 + 2 ...
וכו '
והעבודה עם התקשרות חזרה נכתבת בעיקר בסעיף COM / DCOM וזה כל העניין .... איתו אני רק מתחיל ללמוד ...
ובכן, לא כשלא השתמשתי ב- CALLBACK ו .... עכשיו אני רוצה ללמוד ....
ואין מה להתמרמר ... אם חכם תגיד לי ... אם אין שתיקה ...



petr_v_a   (2001-12-15 00:39) [20]

> יוג'ין זליקובסקי מדוע פעם, זה ההיגיון של התוכנית, תראה, חוץ ממך, הם שיקרו מי יבין את זה, לפחות זו שאלה אחרת. עבוד קשה, ניפוי הלאה עצמו, ואל תשימו לב לאיש :)



iZEN   (2001-12-15 01:30) [21]

התקשרות חוזרת - מה שנקרא "התקשרות חוזרת". הוא הומצא כך שתוכנית כלשהי תוכל "לכבות" את תפקידה (הכתובת שלה) לתוכנית אחרת, כך שהאחרונה (תוכנית אחרת) תוכל לקרוא לה בראשון מבלי לחדש ו / או לנתח את הקוד של התוכנית הראשונה - זה גס רוח.

התקשרות חוזרת משמשת בכל תוכנית לטיפול באירועים חלונות: לדוגמה, מטפלים באירועים שנכתבו על ידי מתכנת הם משתתפים ישירים בשיחות התקשרות מהפונקציה העיקרית של מטפל האירועים בחלונות Windows. זה הכל.

כן, גם כשאתה כותב מטפל באירועי כפתורים בדלפי, אתה כותב נוהל CallBack, שהמהדר מקצה לו לפונקציות חלון הכפתורים.

אפילו בראשית פסקל משתמשים בסוג הפרוצדורלי כדי לספק את מנגנון ההתקשרות (התקשרות או שיחה מאוחרת):

type
TMyProcedure = procedure(a: Integer; b: Char; c: String[23]);
var
MyHandler: TMyProcedure;

procedure OtherProcedure(a: Integer; b: Char; c: String[83]);
begin
WriteLn(a);
WriteLn(b);
WriteLn(c);
end;

BEGIN
...
MyHandler := OtherProcedure;
...
MyHandler(10, "f", "Привет из глубины души!");
END.


אז עדיף ללמוד תחילה את העבודה עם ה- DLL, זה יהיה הגיוני יותר.



iZEN   (2001-12-15 01:34) [22]

אני ממליץ לך לא לחבר את המושגים של התקשרות חוזרת ו- COM / DCOM, זה לא עוזר רבות בלימוד הבעיה.



iZEN   (2001-12-15 01:37) [23]

> TMyProcedure = נוהל (א: מספר שלם; b: char; c: מחרוזת [23]);
תיקון:
סוג
TMyProcedure = נוהל (א: מספר שלם; b: char; c: מחרוזת [83]);



y-soft   (2001-12-15 10:29) [24]

> יוג'ין זליקובסקי ©

הסברים:

הספרייה אינה חייבת לדעת כלל את סוג האובייקט שלנו, ולכן אנו פשוט מעבירים מצביע לא מקליד כאשר נקרא הנוהל מהספריה. יש שפות בהן סוגי ההתייחסות נעדרים לחלוטין - במקרה זה כדאי להטיל מצביע לאובייקט שלנו למספר שלם.

procedure TMyObject.CallSomeProc;
begin
SomeProc(Self, @MyCallback);
end;


בקוד ה- Dll:

procedure SomeProc(Reference : pointer; MyCbk : TMyCallback); stdcall;
begin
//...Какие-то действия
MyCbk(Reference); //Вызов Callback
end;


בהתאם לכך, במטפל בהליך התקשרות חוזרת אנו מבצעים במפורש את המרת הסוגים

procedure MyCallback(Reference : pointer); stdcall;
begin
TMyObject(Reference).SomeMethod; //вот здесь!!!
end;


ב COM / DCOM, אגב, משתמשים במנגנונים שונים לחלוטין למטרות דומות.



Eugene Zelikovsky   (2001-12-15 13:00) [25]

תודה לכולם. הרוויח !!!!!!!
> petr_v_a
התברר שהגישה שלך הייתה הכי עובדת .... עם תיקונים קטנים לתוכנית שלי ...
> iZEN
ותודה על העזרה ... וטיול בהיסטוריה !!!!



עמודים: 1 ענף שלם

פורום: "ראשי";
ארכיון נוכחי: 2002.01.08;
הורדה: [xml.tar.bz2];

למעלה





זיכרון: 0.64 MB
זמן: 0.047 c
14-22413
ENG
2001-11-11 21:27
2002.01.08
CD-RW


7-22418
מיקל
2001-09-20 09:06
2002.01.08
בדחיפות! Comp במקום המדפסת.


7-22421
שן
2001-08-28 15:05
2002.01.08
טעינת נתונים דרך יציאת COM


14-22411
מדברו
2001-11-12 20:52
2002.01.08
מפתח תקליטור WinXP


14-22393
פליקס
2001-11-08 21:54
2002.01.08
מה לעשות?





אפריקאנס אלבני ערבי אַרְמֶנִי אזרביג'אן הבסקים בלארוסית בולגרי קטלאנית הסיני (פשוט) סינית (מסורתית) קרואטית צ'כיה דני הולנדי אנגלית אסטוני פיליפיני פיני צרפתית
גליציה גאורגיה גרמני יווני קריאולית האיטית עברי הינדי הונגרי איסלנדי אינדונזי אירי איטלקי יפני קוריאני לטבי ליטאי מקדוניה מלאית מלטזית נורבגי
פרסי פולני פורטוגזי רומנית רוסי סרבית סלובקי סלובני ספרדי סוואהילית שבדי תאילנדי תורכי אוקראיני אורדו ויאטנמית וולשית יידיש בנגלית בוסנית
קבואנו אספרנטו גוג'ראטית האוסה המונג איגבו יָאוָנִי קנאדה לחמר לאו הלטינית מאורים מרתי מונגולי נפאלית פונג'בית סומליה טמילית טלוגו יורובה
זולו
Английский Французский Немецкий Итальянский Португальский Русский Испанский