PDA

View Full Version : سوال: مشکل با نمایش دستورات در ویندوز نمایش با فرمت خاص)



nsco_nsco
یک شنبه 21 فروردین 1390, 04:26 صبح
سلام دوستان من یک مشکل برام به وجود اومده اومدم یک دی ال ال به طور مثال به این صورت نوشتم :


function D: PChar;stdcall;
VAR
S1:STRING ;
begin
S1:= DateToStr(Now );
S1:=MidStr(S1,7,10);
Result :=PChar(S1);
end;


اومدم و پس از گرفتن تاریخ سیستم گفتم دو کاراکتر مثلا فولان رو بگیر و به خروجی دی ال ال بده و در فایل اگزه به صورت دینامیک نمایش دادم من با دلفی 2010 و ویندوز سون برنامه رو نوشتم مشکل اینجاست پس از اینکه در سون اجرا می کنم به خوبی نمایش داده می شود و به خوبی جدا سازی کاراکتر انجام می شود اما در ویندوز اکس پی این کار رو درست انجام نمی دهد و دو کاراکتر مثلا یکی بعد رو می گیرد و نمایش می دهد .
حالا می خواستم ببینم میشه کاری کرد که به صورت یک فرمت نمایش داده شود مثل نمایش ساعت به شکل زیر :


S1:= formatdatetime('HH:MM:SS',time);

تا دیگه با یک فرمت خاص دیگر مشکل افرین نشود ممنون می شوم سریع پاسخ بدید با تشکر از همه شما دوستان:قلب:

AliReza Vafakhah
یک شنبه 21 فروردین 1390, 11:55 صبح
تابع DateToStr دوتا overload داره که تو overload دومش یک پارامتر از نوع TFormatSettings میگیره که فرمت تبدیل تاریخ رو مشخص می کنه.


procedure TForm1.FormCreate(Sender: TObject);
var
TFM: TFormatSettings;
begin
TFM.DateSeparator:= '/';
TFM.ShortDateFormat:= 'yyyy/mm/dd';
Caption:= DateToStr(Now, TFM);
end;

Felony
سه شنبه 23 فروردین 1390, 16:04 عصر
علاوه بر مورد ذکر شده میتونید از توابع DayOf , MonthOf , YearOf از کتاخانه DateUtils استفاده کنید ؛ مثلا :

var
aDate: TDate;
aDay: Word;
begin
aDate:= Now;
aDay:= DayOf(aDate);
ShowMessage(IntToStr(aDay));
end;

vcldeveloper
سه شنبه 23 فروردین 1390, 19:42 عصر
این کدی که نوشتید، چرا خروجی تابع رو PChar تعریف کردید؟ اگر یکی با یک زبان غیر دلفی بخواد با این DLL ارتباط برقرار کنه، باید منتظر چه نتیجه ایی باشه؟!

nsco_nsco
سه شنبه 23 فروردین 1390, 23:32 عصر
سلام
اقای کشاورز شما که گفتید با پی چار معرفی کنم تا در زبان های دیگه بشه استفاده کرد اخرش نفهمیدیم منظورتون چیه ؟؟؟ ممنون می شوم سریع پاسخ بدید .:قلب:

tdkhakpur
چهارشنبه 24 فروردین 1390, 02:24 صبح
گفتید با پی چار معرفی کنم تا در زبان های دیگه بشه استفاده کرد اخرش نفهمیدیم منظورتون چیه

منظور از تنظیم نوع داده بصورت pchar برای dll برای استفاده در زبانهای دیگه اینه که شما به داده هایی اشاره کنید که نوع خاصی مثل formیا string و یا نمونه هایی مشابه نباشه بلکه اشاره به بایت یا char باشه نه string که شما در بالا بهش اشاره نمودید.


Result :=PChar(S1);

nsco_nsco
چهارشنبه 24 فروردین 1390, 22:37 عصر
سلام ممنون از اینی که گفتید اما ممنون می شوم یک مثالمثل اونی که من زدم بزنید چون از مثال بالا چیزی نفهمیدم با تشکر:قلب:

tdkhakpur
پنج شنبه 25 فروردین 1390, 00:16 صبح
ممنون از اینی که گفتید اما ممنون می شوم یک مثالمثل اونی که من زدم بزنید چون از مثال بالا چیزی نفهمیدم با تشکر

اون چیزی که شما در پی اش هستید چندان سخت نیست اما اونچه که شما برداشت کردید و قصد استفاده ازش رو دارید اشتباه نیست ولی تضمینی ندارد به اینکه در همه جا کار بکنه مثلا اگر dll که به این طریق ساخته بشه ممکنه با بورلند سی سازگار باشه اما با vb و یا vs میتونه سازگار نباشه به همین دلیل به شما پیشنهاد شده که برای انتقال و ایجاد ارتباط بین داده ها از متغییرهای char یا بایت استفاده کنید .
ولی اگر برنامه خودتان را بصورت زیر اصلاح کنید میتونید این ایراد رو بردارید(قسمت کامنت شده رو باید با متغییرها تعریف شده بصورت بایت سازگار کنید)


function D: PChar;stdcall;
VAR
ُ1 : array [1..255] of byte;
begin
//S1:= DateToStr(Now );
//S1:=MidStr(S1,7,10);
Result :=PChar(@S1[1]);
end;

nsco_nsco
پنج شنبه 25 فروردین 1390, 00:34 صبح
سلام ممنون از پاسختون اما من با قرار دادن بایت ( تغییر نوع متغییر) الرور می دهد و می گوید که نمی تواند جا بگیرد در اس یک نمونه :


function d: PChar; stdcall;
VAR
S1:array [1..255] of byte;
begin
S1:= formatdatetime('HH:MM:SS',time);
Result :=PChar(@S1[1]);
end;


لطفا سریع کمک کنید با تشکر :قلب:

tdkhakpur
پنج شنبه 25 فروردین 1390, 00:51 صبح
اما من با قرار دادن بایت ( تغییر نوع متغییر) الرور می دهد و می گوید که نمی تواند جا بگیرد
من جای شما باشم این کار رو انجام میدم.(البته برای این گزینه)


function d: PChar; stdcall;
VAR
S1:array [1..255] of byte;
begin
CopyMemory(@S1[1], pchar(formatdatetime('HH:MM:SS',time)), 10);
Result :=PChar(@S1[1]);
end;

اون طرف dll هم باید متوجه باشید که داده بصورت بایتی هست به همین دلیل برای محاسبات نیاز به تبدیل خواهید داشت.

nsco_nsco
پنج شنبه 25 فروردین 1390, 01:19 صبح
سلام ممنون از پاسختون العان که این کد رو قرار می دم دیگه اصلا فایل اگزم هیچ چیز رو نمایش نمی دهد می گید چه کار کنم :گریه::قلب:

tdkhakpur
پنج شنبه 25 فروردین 1390, 12:13 عصر
العان که این کد رو قرار می دم دیگه اصلا فایل اگزم هیچ چیز رو نمایش نمی دهد می گید چه کار کنم

اون کد یک نوع راهنمایی برای این کار بود.
در ضمن این ایراد میتونه مربوط به محدوده تعریف متغییر باشه به نظرم متغییر(S1) رو بیرون از تابع تعریف کنید تا عمومی باشه.

vcldeveloper
پنج شنبه 25 فروردین 1390, 20:00 عصر
اقای کشاورز شما که گفتید با پی چار معرفی کنم تا در زبان های دیگه بشه استفاده کرد اخرش نفهمیدیم منظورتون چیه ؟؟؟ ممنون می شوم سریع پاسخ بدید
ببینید، وقتی گفته میشه از PChar استفاده کنید، به این معنی نیست که هر جا میخواستید string بنویسید، جاش PChar بنویسید!

شما رفتید یک متغیر string بصورت Local تعریف کردید، بعدش اونو به عنوان خروجی تابع با PChar برگشت دادید. خب این string یک نوع داده reference-counted هست، به صورت PChar به یک برنامه از یک زبان برنامه نویسی دیگه پاس بشه، چطور باید مدیریت بشه؟!

شما باید از برنامه فراخوان DLL بخواید که براتون فضای مورد نیاز رشته خروجی رو فراهم کنه، سپس شما داده خروجی رو در اون فضای اختصاص داده شده، کپی کنید. چند بار قبلا این موضوع رو توضیح دادم، همین چند روز پیش یک لینک به یک نمونه کد هم در همین سایت قرار دادم.