উইন্ডোজ ফন্ট স্কেলিং 100% এর চেয়ে বেশি হলে আমি কীভাবে আমার জিইউআইয়ের সাথে ভাল আচরণ করতে পারি?


107

উইন্ডোজ কন্ট্রোল প্যানেলে বড় ফন্টের আকার নির্বাচন করার সময় (যেমন 125% বা 150%) তখন কোনও ভিসিএল অ্যাপ্লিকেশনটিতে সমস্যা রয়েছে, প্রতিবারই কিছু পিক্সেলওয়ালা সেট করা হয়েছে।

নিন TStatusBar.Panel। আমি এর প্রস্থটি সেট করে রেখেছি যাতে এটিতে ঠিক একটি লেবেল থাকে, এখন বড় ফন্টের সাথে লেবেল "ওভারফ্লোস"। অন্যান্য উপাদানগুলির সাথে একই সমস্যা।

ডেল জাহাজের কিছু নতুন ল্যাপটপ ডিফল্ট সেটিং হিসাবে ইতিমধ্যে 125% সহ, তাই অতীতে এই সমস্যাটি এখন খুব বিরল ছিল এখন এটি সত্যিই গুরুত্বপূর্ণ।

এই সমস্যাটি কাটিয়ে উঠতে কী করা যায়?

উত্তর:


56

দ্রষ্টব্য: দয়া করে অন্যান্য উত্তরগুলি দেখুন কারণ সেগুলিতে খুব মূল্যবান কৌশল রয়েছে। এখানে আমার উত্তরটি কেবল ডিপিআই-সচেতনতাকে সহজ বলে ধরে নেওয়ার বিরুদ্ধে সাবধানতা এবং সতর্কতা সরবরাহ করে।

আমি সাধারণত ডিপিআই-সচেতন স্কেলিং এড়ানো করি TForm.Scaled = True। DPI সচেতনতা কেবল তখনই আমার পক্ষে গুরুত্বপূর্ণ যখন গ্রাহকরা আমাকে কল করে এবং এর জন্য অর্থ দিতে আগ্রহী। এই দৃষ্টির পিছনে প্রযুক্তিগত কারণ হ'ল ডিপিআই-সচেতনতা বা না, আপনি আঘাতের জগতে একটি উইন্ডো খুলছেন। অনেক স্ট্যান্ডার্ড এবং তৃতীয় পক্ষের ভিসিএল নিয়ন্ত্রণগুলি হাই ডিপিআইতে ভাল কাজ করে না। উল্লেখযোগ্য ব্যতিক্রম যে ভিসিএল অংশগুলি যা উইন্ডোজ কমন কন্ট্রোলগুলি আবৃত করে উচ্চ ডিপিআইতে উল্লেখযোগ্যভাবে ভাল কাজ করে। বিপুল সংখ্যক তৃতীয় পক্ষ এবং বিল্ট-ইন ডেল্ফি ভিসিএল কাস্টম নিয়ন্ত্রণগুলি উচ্চ ডিপিআই-তে ভাল কাজ করে না all যদি আপনি টিএফর্ম চালু করার পরিকল্পনা করেন c

দেলফি নিজেই লিখেছেন ডেলফি। এটি বেশিরভাগ ফর্মের জন্য উচ্চ ডিপিআই সচেতনতামূলক পতাকাটি চালু করেছে, যদিও সম্প্রতি ডেলফি এক্সই 2-তে যেমন আইডিই লেখকরা সিদ্ধান্ত নিয়েছিলেন যে উচ্চ ডিপিআই সচেতনতা প্রকাশের পতাকাটি চালু না করা। নোট করুন যে ডেলফি এক্সই 4 এবং তার পরে, উচ্চ ডিপিআই সচেতনতামূলক পতাকাটি চালু করা হয়েছে, এবং আইডিই ভাল দেখাচ্ছে।

আমি প্রস্তাব দিচ্ছি যে আপনি টিএফর্ম ব্যবহার করবেন না c স্কেলড = ট্রু (যা দেলফিতে একটি ডিফল্ট তাই আপনি যদি এটি পরিবর্তন না করেন তবে আপনার বেশিরভাগ ফর্মগুলি স্কেলড = ট্রু) উচ্চ ডিপিআই আওয়ার পতাকা সহ (ডেভিডের উত্তরে দেখানো হয়েছে) সহ ভিসিএল অ্যাপ্লিকেশনগুলি বিল্ট-ইন ডেল্ফি ফর্ম ডিজাইনার ব্যবহার করে নির্মিত।

আমি অতীতে চেষ্টা করেছি যে আপনি কীভাবে ভাঙ্গতে পারেন সে সম্পর্কে ন্যূনতম নমুনা তৈরির চেষ্টা করতে পারেন যখন আপনি টিএফর্ম.সেসেল্ডটি সত্য, এবং যখন ডেলফি ফর্ম স্কেলিংয়ের কোনও ত্রুটি রয়েছে। এই গ্লিটগুলি সর্বদা এবং কেবলমাত্র 96 ব্যতীত অন্য কোনও ডিপিআই মান দ্বারা ট্রিগার হয় না I আমি অন্যান্য জিনিসের একটি সম্পূর্ণ তালিকা নির্ধারণ করতে পারিনি, যার মধ্যে উইন্ডোজ এক্সপি ফন্টের আকারের পরিবর্তন রয়েছে includes তবে এই সমস্যাগুলি বেশিরভাগই কেবল আমার নিজের অ্যাপ্লিকেশনগুলিতে দেখা যায়, মোটামুটি জটিল পরিস্থিতিতে, আমি আপনাকে নিজে যাচাই করতে পারে এমন কিছু প্রমাণ দেখানোর সিদ্ধান্ত নিয়েছি।

আপনি যখন উইন্ডোজ 7-এ ডিপিআই স্কেলিংটিকে "ফন্ট @ 200%" তে সেট করেন তখন ডেল্ফি এক্সই এর মতো দেখায় এবং ডেল্ফি এক্সই 2 একইভাবে উইন্ডোজ 7 এবং 8 এ বিভক্ত হয়, তবে এই গ্লিটগুলি দেলফি এক্সই 4 হিসাবে স্থির হয়ে দেখা দেয়:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এগুলি বেশিরভাগ স্ট্যান্ডার্ড ভিসিএল নিয়ন্ত্রণ যা উচ্চ ডিপিআইতে খারাপ ব্যবহার করছে। মনে রাখবেন যে বেশিরভাগ জিনিসই মোটেই মাপা যায়নি, তাই ডেলফি আইডিই বিকাশকারীরা ডিপিআই সচেতনতাকে উপেক্ষা করার পাশাপাশি ডিপিআই ভার্চুয়ালাইজেশন বন্ধ করার সিদ্ধান্ত নিয়েছে। যেমন একটি আকর্ষণীয় পছন্দ।

কেবলমাত্র ডিপিআই ভার্চুয়ালাইজেশন বন্ধ করুন যদি এই নতুন অতিরিক্ত ব্যথার উত্স এবং কঠিন পছন্দগুলি চান। আমি আপনাকে একা ছেড়ে দেওয়ার পরামর্শ দিই। মনে রাখবেন যে উইন্ডোজ সাধারণ নিয়ন্ত্রণগুলি বেশিরভাগ ক্ষেত্রে সূক্ষ্মভাবে কাজ করে বলে মনে হয়। নোট করুন যে ডেল্ফি ডেটা-এক্সপ্লোরার নিয়ন্ত্রণটি একটি স্ট্যান্ডার্ড উইন্ডোজ ট্রি সাধারণ নিয়ন্ত্রণের চারপাশে একটি সি # উইনফর্মস মোড়ক। এটি একটি খাঁটি মাইক্রোসফ্ট গ্লাইচ, এবং এটির ফিক্সিংয়ের জন্য এম্বারকাডেরোকে খাঁটি নেটিভ পুনরায় লেখার প্রয়োজন হতে পারে their এমনকি মাইক্রোসফ্ট উইনফর্মগুলি স্বচ্ছভাবে, স্বয়ংক্রিয়ভাবে এবং কাস্টম ক্লডজ কোড ছাড়াই উচ্চ ডিপিআই হ্যান্ডেল করতে পারে না।

আপডেট: আকর্ষণীয় ফ্যাক্টয়েড: যদিও ডেল্ফি আইডিই "ভার্চুয়ালাইজড" হিসাবে দেখা যাচ্ছে না, এটি ডেভিডের দ্বারা প্রদর্শিত ম্যানিফেস্ট সামগ্রীটি "নন-ডিপিআই-ভার্চুয়ালাইজেশন" অর্জন করতে ব্যবহার করছে না। সম্ভবত এটি রানটাইমে কিছু এপিআই ফাংশন ব্যবহার করছে।

আপডেট 2: আমি কীভাবে 100% / 125% DPI সমর্থন করব তার প্রতিক্রিয়া হিসাবে, আমি একটি দ্বি-পর্যায়ের পরিকল্পনা নিয়ে আসব। প্রথম পর্যায়টি হ'ল কাস্টম নিয়ন্ত্রণগুলির জন্য আমার কোডের ইনভেন্টরি যা হাই ডিপিআইয়ের জন্য স্থির করা দরকার এবং তারপরে সেগুলি ঠিক করার বা তাদের শেষ করার পরিকল্পনা তৈরি করুন a দ্বিতীয় ধাপটি আমার কোডের কিছু অংশ নেবে যা বিন্যাস ব্যবস্থাপনায় বিন্যাস হিসাবে ডিজাইন করা হয়েছে এবং সেগুলি ফর্মগুলিতে পরিবর্তন করা হবে যা কোনও ধরণের বিন্যাস পরিচালনা ব্যবহার করে যাতে ডিপিআই বা ফন্টের উচ্চতার পরিবর্তনগুলি ক্লিপিং ছাড়াই কাজ করতে পারে। আমি সন্দেহ করি যে "আন্তঃ-নিয়ন্ত্রণ" কাজের চেয়ে বেশিরভাগ অ্যাপ্লিকেশনগুলিতে এই "আন্ত-নিয়ন্ত্রণ" বিন্যাস কাজটি আরও জটিল হবে।

আপডেট: ২০১ 2016 সালে, সর্বশেষতম ডেলফি 10.1 বার্লিন আমার 150 ডিপিআই ওয়ার্কস্টেশনে ভালভাবে কাজ করছে।


5
যে এপিআই ফাংশন হবে SetProcessDPIAware
ডেভিড হেফারনান

2
চমৎকার। নতুন অনুষঙ্গ জন্য ধন্যবাদ। আমি আপনাকে একটি উত্তর হিসাবে সম্ভাব্য রুট হিসাবে পরামর্শ দিতে আপনার উত্তর পরিবর্তন করতে পরামর্শ দিই। এটি গ্রাহকরা এমনকি সেই বিকল্পটি কনফিগার করতেও পারেন (এটি যদি তাদের পক্ষে কাজ না করে তবে এটি বন্ধ করুন)।
ওয়ারেন পি

ডেলফির স্প্ল্যাশ স্ক্রিনটি ডিপিআই ভার্চুয়ালাইজেশন ব্যবহার করে, সম্ভবত স্প্ল্যাশ ফর্মটি দৃশ্যমান হওয়ার পরে সেটডিপিআইএওয়্যারের কল করার পরে।
ওয়ারেন পি

6
আরএডি স্টুডিও হ'ল স্ট্যান্ডার্ড ভিসিএল নিয়ন্ত্রণ, কাস্টম নিয়ন্ত্রণ, নেট উইনফর্ম এবং ফায়ারমনকি ফর্মগুলির একটি বড় মিশ্রণ। এতে অবাক হওয়ার কিছু নেই যে সমস্যা আছে। আর এজন্যই আরএডি স্টুডিও একটি ভাল উদাহরণ নয়।
টরবিনস

1
আপনি যদি সঠিক হন তবে এটি নিজেই ভিসিএল এর মাথা বালুতে রয়েছে। এমনকি মাইক্রোসফ্টের বালুতে মাথা রয়েছে। কেবলমাত্র আমি যে ফ্রেমওয়ার্কটি ব্যবহার করেছি এটি ম্যাকের সিওসিওএ একটি দূরবর্তীভাবে পাসযোগ্য কাজ করে।
ওয়ারেন পি

63

.Dfm ফাইলে আপনার সেটিংস যথাযথভাবে মাপা হবে, যতক্ষণ Scaledআছে True

আপনি কোডে মাত্রা নির্ধারণের হয়, তাহলে আপনি তাদের আকার পরিবর্তন করতে প্রয়োজন Screen.PixelsPerInchদ্বারা বিভক্ত Form.PixelsPerInch। এটি করতে ব্যবহার করুন MulDiv

function TMyForm.ScaleDimension(const X: Integer): Integer;
begin
  Result := MulDiv(X, Screen.PixelsPerInch, PixelsPerInch);
end;

ফর্ম অধ্যবসায় কাঠামোটি যখন Scaledএটি করে True

প্রকৃতপক্ষে, আপনি এই ফাংশনটি এমন একটি সংস্করণ দিয়ে প্রতিস্থাপনের জন্য একটি যুক্তিযুক্ত যুক্তি তৈরি করতে পারেন যা ডিনিনেটরের জন্য 96 এর মানকে হার্ড কোড করে। এটি আপনাকে পরম মাত্রা মানগুলি ব্যবহার করতে এবং আপনার বিকাশের মেশিনে ফন্ট স্কেলিং পরিবর্তন করতে এবং .dfm ফাইলটি পুনরায় সেভ করার ক্ষেত্রে অর্থ পরিবর্তনের বিষয়ে চিন্তা করার অনুমতি দেয়। যে কারণে গুরুত্বপূর্ণ তা PixelsPerInchহ'ল .dfm ফাইলটিতে সঞ্চিত সম্পত্তি হ'ল .dfm ফাইলটি সর্বশেষ সেভ করা মেশিনের মূল্য।

const
  SmallFontsPixelsPerInch = 96;

function ScaleFromSmallFontsDimension(const X: Integer): Integer;
begin
  Result := MulDiv(X, Screen.PixelsPerInch, SmallFontsPixelsPerInch);
end;

সুতরাং, থিমটি অব্যাহত রাখার সাথে সাথে সাবধান হওয়ার অন্য একটি বিষয় হ'ল যদি আপনার প্রকল্পটি বিভিন্ন ডিপিআই মান সহ একাধিক মেশিনে বিকশিত হয় তবে আপনি দেখতে পাবেন যে .dfm ফাইলগুলি সংরক্ষণ করার সময় ডেল্ফি যে স্কেলিংটি ব্যবহার করে ফলাফলগুলি ধারাবাহিক সম্পাদনাগুলিতে ঘুরে বেড়াচ্ছে নিয়ন্ত্রণগুলিতে আসে । আমার কাজের জায়গায়, এড়াতে, আমাদের একটি কঠোর নীতি রয়েছে যা ফর্মগুলি কেবলমাত্র 96dpi (100% স্কেলিং) এ সম্পাদিত হয়।

আসলে আমার সংস্করণটিও ScaleFromSmallFontsDimensionফর্ম ফন্টের সম্ভাবনার জন্য ভাতা দেয় যা ডিজাইনের সময় সেট থেকে রানটাইমের সময় পৃথক হয়। এক্সপি মেশিনে আমার আবেদনের ফর্মগুলিতে 8pt তাহোমা ব্যবহার করা হয়। ভিস্তা এবং 9 পিপিতে Segoe UI ব্যবহার করা হয় এটি আরও একটি ডিগ্রি স্বাধীনতা সরবরাহ করে। স্কেলিং এর জন্য অবশ্যই অ্যাকাউন্টটি আবশ্যক কারণ উত্স কোডে ব্যবহৃত পরম মাত্রা মানগুলি 96 ডিপিআই-তে 8pt তাহোমার বেসলাইনের সাথে সম্পর্কিত বলে ধরে নেওয়া হয়।

আপনি যদি আপনার ইউআইতে কোনও চিত্র বা গিলিফ ব্যবহার করেন তবে এগুলিও স্কেল করা দরকার। একটি সাধারণ উদাহরণ হ'ল গ্লাইফগুলি যা সরঞ্জামদণ্ড এবং মেনুগুলিতে ব্যবহৃত হয়। আপনি এই গ্লাইফগুলি আপনার কার্যকর করার সাথে যুক্ত আইকন সংস্থান হিসাবে সরবরাহ করতে চাইবেন। প্রতিটি আইকনটিতে বিভিন্ন আকারের আকার থাকা উচিত এবং তারপরে রানটাইম আপনি সর্বাধিক উপযুক্ত আকার চয়ন করেন এবং এটি একটি চিত্রের তালিকায় লোড করুন। এই বিষয়টির কিছু বিশদ এখানে পাওয়া যাবে: আমি কীভাবে কোনও এলিয়াসে ভোগা না করে কোনও সংস্থান থেকে আইকনগুলি লোড করব?

আর একটি দরকারী কৌশল হ'ল আপেক্ষিক ইউনিটগুলিতে মাত্রা নির্ধারণ করা TextWidthবা এর সাথে সম্পর্কিত TextHeight। সুতরাং, আপনি যদি আকারের 10 টি উল্লম্ব লাইন হতে চান তবে কিছু ব্যবহার করতে পারেন 10*Canvas.TextHeight('Ag')। এটি একটি খুব রুক্ষ এবং প্রস্তুত মেট্রিক কারণ এটি লাইন স্পেসিং ইত্যাদির অনুমতি দেয় না। যাইহোক, প্রায়ই সব আপনাকে যা করতে হবে সঙ্গে সঠিকভাবে যে গুই দাঁড়িপাল্লা ব্যবস্থা করতে সক্ষম হতে হয় PixelsPerInch

এছাড়াও আপনি হচ্ছে আপনার আবেদন চিহ্নিত করা উচিত সচেতন উচ্চ DPI । এটি করার সর্বোত্তম উপায় হ'ল অ্যাপ্লিকেশন ম্যানিফেস্টের মাধ্যমে। যেহেতু ডেলফির বিল্ড সরঞ্জামগুলি আপনাকে ম্যানিফেস্টটি কাস্টমাইজ করার অনুমতি দেয় না আপনি এটি ব্যবহার করেন তা আপনাকে নিজের নিজস্ব প্রকাশিত সংস্থানকে লিঙ্ক করতে বাধ্য করে।

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings
         xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

রিসোর্স স্ক্রিপ্টটি এর মতো দেখাচ্ছে:

1 24 "Manifest.txt"

যেখানে Manifest.txtপ্রকৃত ম্যানিফেস্ট রয়েছে। আপনাকে comctl32 v6 বিভাগটি অন্তর্ভুক্ত করে সেট requestedExecutionLevelকরতে হবে asInvoker। তারপরে আপনি এই সংকলিত সংস্থানটিকে আপনার অ্যাপ্লিকেশনে লিঙ্ক করুন এবং নিশ্চিত করুন যে ডেল্ফি তার ম্যানিফেস্টের সাথে এটি করার চেষ্টা করে না। আধুনিক ডেলফিতে আপনি রানটাইম থিম প্রকল্পের বিকল্পটি কারও কাছে সেট করে সেটি অর্জন করেন।

ম্যানিফেস্টটি হ'ল আপনার অ্যাপ্লিকেশনকে উচ্চ ডিপিআই সচেতন বলে ঘোষণা করার সঠিক উপায়। আপনি যদি কেবলমাত্র আপনার ম্যানিফেস্টের সাথে গোলমাল না করে দ্রুত চেষ্টা করে দেখতে চান তবে কল করুন SetProcessDPIAware। আপনার অ্যাপ্লিকেশন চলাকালীন আপনি যে প্রথম কাজটি করেন তা হিসাবে এটি করুন। প্রাথমিকভাবে এক প্রাথমিক ইউনিট সূচনা বিভাগে, বা আপনার .dpr ফাইলের প্রথম জিনিস হিসাবে।

যদি আপনি আপনার অ্যাপ্লিকেশনটিকে উচ্চ ডিপিআই সচেতন বলে ঘোষণা না করেন তবে ভিস্তা এবং আপ এটি 125% এর উপরে যে কোনও ফন্ট স্কেলিংয়ের জন্য একটি উত্তরাধিকারী মোডে রেন্ডার করবে। এটি বেশ ভয়ঙ্কর দেখাচ্ছে। সেই ফাঁদে পড়া এড়াতে চেষ্টা করুন।

উইন্ডোজ 8.1 প্রতি মনিটর ডিপিআই আপডেট

উইন্ডোজ 8.1 হিসাবে, এখন প্রতি মনিটর ডিপিআই সেটিংসের জন্য ওএস সমর্থন রয়েছে ( http://msdn.microsoft.com/en-ca/magazine/dn574798.aspx )। এটি আধুনিক ডিভাইসগুলির জন্য একটি বড় সমস্যা যার মধ্যে খুব আলাদা ক্ষমতা সহ বিভিন্ন ডিসপ্লে সংযুক্ত থাকতে পারে। আপনার কাছে খুব উচ্চ ডিপিআই ল্যাপটপ স্ক্রিন এবং কম ডিপিআই বহিরাগত প্রজেক্টর থাকতে পারে। এই জাতীয় দৃশ্যের সমর্থন করা উপরে বর্ণিত চেয়ে আরও বেশি কাজ করে।


2
এটি সবসময় সত্য নয়। প্রকৃতপক্ষে, স্কেলড = সত্য সেট করা এবং তারপরে উচ্চ ডিপিআই সচেতন করা সর্বাধিক ডেলফি অ্যাপ্লিকেশনগুলিতে কিছু অদ্ভুত ভাঙ্গন ঘটায়। আমি আমার অ্যাপ্লিকেশনগুলিকে উচ্চ ডিপিআইতে কাজ করার চেষ্টা করার জন্য কয়েক ঘন্টা সময় ব্যয় করেছি এবং দেখেছি যে ক্রপ করা, পর্দা বন্ধ করে দেওয়া, বিভিন্ন নিয়ন্ত্রণে অতিরিক্ত বা অনুপস্থিত স্ক্রোলবারগুলি ইত্যাদির চেয়ে ভয়ঙ্কর চেহারাযুক্ত পিক্সেলেশন থাকা ভাল
ওয়ারেন পি

@ ওয়ারেনপি আমি মনে করি আপনার অ্যাপগুলিতে এই সমস্যাগুলি বিশেষ। আমার ব্যক্তিগত অভিজ্ঞতাটি হ'ল আমার ডেলফি অ্যাপটি 200% ফন্ট স্কেলিংয়ে এমনকি পুরোপুরি স্কেল করে।
ডেভিড হেফারনান

2
@ ওয়ারেনপি তাইলে কি? ডেলফি আইডিইর চেয়ে ভাল আচরণ করে এমন অ্যাপ্লিকেশনগুলি তৈরি করতে ডেলফি ব্যবহার করা পুরোপুরি সম্ভব।
ডেভিড হেফারনান

1
আমি ডেল্ফি 5,6,7 এর সাথে নির্ধারিত স্থির সীমানা সহ প্রচুর সংলাপ দেখেছি এবং স্কেলিং সেটিংটি ব্যর্থ হওয়ার পক্ষে সত্য। ঠিক আছে লুকানো, বোতামগুলি বাতিল করুন ইত্যাদি এমনকি ডেলফাই ২০০hi এর কিছু সংলাপও এটিকে কামড়েছে বলে মনে করে। নেটিভ ডেল্ফি উপাদানগুলি এবং উইন্ডোজের উপাদানগুলি মিশ্রণও অদ্ভুত প্রভাব দেয়। আমি সবসময় জিইউআইকে 125% ফন্ট স্কেলিংয়ে বিকাশ করি এবং স্কেলড সম্পত্তিটি মিথ্যাতে রাখি।
LU আরডি

2
দুর্দান্ত জিনিস। চমত্কার তথ্যের জন্য +1। আমার মতামত (এটি করবেন না) আপনি যখন এটি করতে চান তখন কীভাবে এটি করতে হবে তা জানা প্রয়োজনের পরে দ্বিতীয় স্থানে ...
ওয়ারেন পি

42

এটিও লক্ষ করা গুরুত্বপূর্ণ যে ব্যবহারকারীর ডিপিআইকে সম্মান জানানো আপনার আসল কাজের একটি উপসেট মাত্র:

ব্যবহারকারীর ফন্ট আকার সম্মান

কয়েক দশক ধরে, উইন্ডোজ পিক্সেলের পরিবর্তে ডায়ালগ ইউনিটগুলি ব্যবহার করে ধারণাটি সম্পাদনকারী বিন্যাসের সাহায্যে এই সমস্যাটি সমাধান করেছে । একটি "ডায়ালগ ইউনিট" সংজ্ঞায়িত করা হয় যাতে ফন্টের গড় চরিত্রটি হয়

  • 4 টি ডায়ালগ ইউনিট (dlus) প্রশস্ত, এবং
  • 8 টি ডায়ালগ ইউনিট (ক্লাস) উচ্চ

এখানে চিত্র বর্ণনা লিখুন

ডেলফি একটি (বগি) ধারণার সাথে জাহাজটি দেয় Scaled, যেখানে কোনও ফর্ম স্বয়ংক্রিয়ভাবে এর উপর ভিত্তি করে সামঞ্জস্য করার চেষ্টা করে

  • ব্যবহারকারীর উইন্ডোজ ডিপিআই সেটিংস, আয়াত
  • বিকাশকারীর মেশিনে ডিপিআই সেটিং যিনি সর্বশেষ ফর্মটি সংরক্ষণ করেছিলেন

আপনি যখন সমস্যার সাথে ফর্মটি ডিজাইন করেছেন তার চেয়ে আলাদা কোনও ফন্ট ব্যবহার করে ব্যবহারকারী সমস্যাটি সমাধান করে না:

  • বিকাশকারী এমএস সানস সেরিফ 8 টি (যেখানে গড় চরিত্রটি 6.21px x 13.00px96 ডিপিআই তে রয়েছে) দিয়ে ফর্মটি ডিজাইন করেছেন
  • তাহোমা5.94px x 13.00px 8pt (যেখানে গড় চরিত্রটি 96dpi এ রয়েছে) সহ চলমান ব্যবহারকারী

    উইন্ডোজ 2000 বা উইন্ডোজ এক্সপি-র জন্য যে কোনও অ্যাপ্লিকেশন বিকাশকারীদের ক্ষেত্রে যেমন হয়েছিল।

অথবা

  • বিকাশকারী ** তাহোমা 8pt * (যেখানে গড় চরিত্রটি 5.94px x 13.00px96dpi এ রয়েছে) দিয়ে ফর্মটি ডিজাইন করেছেন
  • Segoe UI 9pt (যেখানে গড় চরিত্রটি 6.67px x 15px96dpi এ রয়েছে) এর সাথে চলমান একজন ব্যবহারকারী

একজন ভাল বিকাশকারী হিসাবে আপনি আপনার ব্যবহারকারীর ফন্ট পছন্দগুলি সম্মান করতে যাচ্ছেন। এর অর্থ হ'ল নতুন ফন্টের আকারটি মেলাতে আপনার ফর্মের সমস্ত নিয়ন্ত্রণও স্কেল করতে হবে:

  • 12.29% (6.67 / 5.94) দ্বারা অনুভূমিকভাবে সমস্ত প্রসারিত করুন
  • 15.38% (15/13) দ্বারা উল্লম্বভাবে সবকিছু প্রসারিত করুন

Scaled আপনার জন্য এটি পরিচালনা করবে না।

এটি আরও খারাপ হয় যখন:

  • Segoe UI 9pt এ আপনার ফর্মটি ডিজাইন করেছেন (উইন্ডোজ ভিস্তা, উইন্ডোজ 7, ​​উইন্ডোজ 8 ডিফল্ট)
  • ব্যবহারকারী Segoe UI 14pt চালাচ্ছেন (যেমন আমার পছন্দ) যা10.52px x 25px

এখন আপনাকে সব কিছু স্কেল করতে হবে

  • অনুভূমিকভাবে 57.72%
  • উল্লম্বভাবে 66.66%

Scaled আপনার জন্য এটি পরিচালনা করবে না।


আপনি যদি স্মার্ট হন তবে দেখতে পাবেন কীভাবে ডিপিআইকে সম্মান দেওয়া অবান্তর নয়:

  • Segoe UI 9pt @ 96dpi (6.67px x 15px) দিয়ে ডিজাইন করা ফর্ম
  • ব্যবহারকারী Segoe UI 9pt @ 150dpi (10.52px x 25px) দিয়ে চলছে

আপনি ব্যবহারকারীর ডিপিআই সেটিংসের দিকে নজর দিচ্ছেন না, আপনি তাদের ফন্টের আকারটি দেখছেন । দু'জন ব্যবহারকারী চলছে

  • Segoe UI 14pt @ 96dpi (10.52px x 25px)
  • Segoe UI 9pt @ 150dpi (10.52px x 25px)

একই ফন্ট চলমান । ডিপিআই হ'ল একটি জিনিস যা হরফ আকারকে প্রভাবিত করে; ব্যবহারকারীর পছন্দগুলি অন্যটি।

StandardizeFormFont

ক্লোভিস লক্ষ্য করেছে যে আমি এমন একটি ফাংশন উল্লেখ করেছি যা StandardizeFormFontকোনও ফর্মের ফন্টকে স্থির করে, এবং এটি নতুন ফন্টের আকারের আকার দেয়। এটি একটি স্ট্যান্ডার্ড ফাংশন নয়, তবে কার্যকরীতার একটি সম্পূর্ণ সেট যা বোরল্যান্ড কখনও পরিচালনা করেনি এমন সাধারণ কাজটি সম্পাদন করে।

function StandardizeFormFont(AForm: TForm): Real;
var
    preferredFontName: string;
    preferredFontHeight: Integer;
begin
    GetUserFontPreference({out}preferredFontName, {out}preferredFontHeight);

    //e.g. "Segoe UI",     
    Result := Toolkit.StandardizeFormFont(AForm, PreferredFontName, PreferredFontHeight);
end;

উইন্ডোজ 6 টি বিভিন্ন ফন্ট আছে; উইন্ডোজে কোনও "ফন্ট সেটিং" নেই।
তবে আমরা অভিজ্ঞতা থেকে জানি যে আমাদের ফর্মগুলির আইকন শিরোনাম ফন্ট সেটিংসটি অনুসরণ করা উচিত

procedure GetUserFontPreference(out FaceName: string; out PixelHeight: Integer);
var
   font: TFont;
begin
   font := Toolkit.GetIconTitleFont;
   try
      FaceName := font.Name; //e.g. "Segoe UI"

      //Dogfood testing: use a larger font than we're used to; to force us to actually test it    
      if IsDebuggerPresent then
         font.Size := font.Size+1;

      PixelHeight := font.Height; //e.g. -16
   finally
      font.Free;
   end;
end;

একবার আমরা ফন্টের আকার আমরা ফর্ম স্কেল হবে জানি করতে , আমরা ফর্ম সাম্প্রতিক হরফ উচ্চতা (পেতে পিক্সেলে ), এবং যে গুণক দ্বারা আপ স্কেল।

উদাহরণস্বরূপ, আমি যদি ফর্মটি এখানে সেট করে দিচ্ছি -16এবং ফর্মটি বর্তমানে রয়েছে -11তবে আমাদের দ্বারা সম্পূর্ণ ফর্মটি স্কেল করতে হবে:

-16 / -11 = 1.45454%

মানককরণ দুটি ধাপে ঘটে। নতুন: পুরানো ফন্টের আকারের অনুপাত অনুসারে ফর্মটি প্রথম স্কেল করুন। তারপরে নতুন ফন্টটি ব্যবহার করতে আসলে নিয়ন্ত্রণগুলি (পুনরাবৃত্তভাবে) পরিবর্তন করুন।

function StandardizeFormFont(AForm: TForm; FontName: string; FontHeight: Integer): Real;
var
    oldHeight: Integer;
begin
    Assert(Assigned(AForm));

    if (AForm.Scaled) then
    begin
        OutputDebugString(PChar('WARNING: StandardizeFormFont: Form "'+GetControlName(AForm)+'" is set to Scaled. Proper form scaling requires VCL scaling to be disabled, unless you implement scaling by overriding the protected ChangeScale() method of the form.'));
    end;

    if (AForm.AutoScroll) then
    begin
        if AForm.WindowState = wsNormal then
        begin
            OutputDebugString(PChar('WARNING: StandardizeFormFont: Form "'+GetControlName(AForm)+'" is set to AutoScroll. Form designed size will be suseptable to changes in Windows form caption height (e.g. 2000 vs XP).'));
                    if IsDebuggerPresent then
                        Windows.DebugBreak; //Some forms would like it (to fix maximizing problem)
        end;
    end;

    if (not AForm.ShowHint) then
    begin
        AForm.ShowHint := True;
        OutputDebugString(PChar('INFORMATION: StandardizeFormFont: Turning on form "'+GetControlName(AForm)+'" hints. (ShowHint := True)'));
                    if IsDebuggerPresent then
                        Windows.DebugBreak; //Some forms would like it (to fix maximizing problem)
    end;

    oldHeight := AForm.Font.Height;

    //Scale the form to the new font size
//  if (FontHeight <> oldHeight) then    For compatibility, it's safer to trigger a call to ChangeScale, since a lot of people will be assuming it always is called
    begin
        ScaleForm(AForm, FontHeight, oldHeight);
    end;

    //Now change all controls to actually use the new font
    Toolkit.StandardizeFont_ControlCore(AForm, g_ForceClearType, FontName, FontHeight,
            AForm.Font.Name, AForm.Font.Size);

    //Return the scaling ratio, so any hard-coded values can be multiplied
    Result := FontHeight / oldHeight;
end;

এখানে আসলে একটি ফর্ম স্কেলিংয়ের কাজ। এটি বোরল্যান্ডের নিজস্ব Form.ScaleByপদ্ধতিতে বাগের চারপাশে কাজ করে । প্রথমে এটি ফর্মের সমস্ত অ্যাঙ্কর অক্ষম করতে হবে, তারপরে স্কেলিংটি সম্পাদন করবে, তারপরে অ্যাঙ্কারগুলি পুনরায় সক্ষম করবে:

TAnchorsArray = array of TAnchors;

procedure ScaleForm(const AForm: TForm; const M, D: Integer);
var
    aAnchorStorage: TAnchorsArray;
    RectBefore, RectAfter: TRect;
    x, y: Integer;
    monitorInfo: TMonitorInfo;
    workArea: TRect;
begin
    if (M = 0) and (D = 0) then
        Exit;

    RectBefore := AForm.BoundsRect;

    SetLength(aAnchorStorage, 0);
    aAnchorStorage := DisableAnchors(AForm);
    try
        AForm.ScaleBy(M, D);
    finally
        EnableAnchors(AForm, aAnchorStorage);
    end;

    RectAfter := AForm.BoundsRect;

    case AForm.Position of
    poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter,
    poDesigned: //i think i really want everything else to also follow the nudging rules...why did i exclude poDesigned
        begin
            //This was only nudging by one quarter the difference, rather than one half the difference
//          x := RectAfter.Left - ((RectAfter.Right-RectBefore.Right) div 2);
//          y := RectAfter.Top - ((RectAfter.Bottom-RectBefore.Bottom) div 2);
            x := RectAfter.Left - ((RectAfter.Right-RectAfter.Left) - (RectBefore.Right-RectBefore.Left)) div 2;
            y := RectAfter.Top - ((RectAfter.Bottom-RectAfter.Top)-(RectBefore.Bottom-RectBefore.Top)) div 2;
        end;
    else
        //poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly:
        x := RectAfter.Left;
        y := RectAfter.Top;
    end;

    if AForm.Monitor <> nil then
    begin
        monitorInfo.cbSize := SizeOf(monitorInfo);
        if GetMonitorInfo(AForm.Monitor.Handle, @monitorInfo) then
            workArea := monitorInfo.rcWork
        else
        begin
            OutputDebugString(PChar(SysErrorMessage(GetLastError)));
            workArea := Rect(AForm.Monitor.Left, AForm.Monitor.Top, AForm.Monitor.Left+AForm.Monitor.Width, AForm.Monitor.Top+AForm.Monitor.Height);
        end;

//      If the form is off the right or bottom of the screen then we need to pull it back
        if RectAfter.Right > workArea.Right then
            x := workArea.Right - (RectAfter.Right-RectAfter.Left); //rightEdge - widthOfForm

        if RectAfter.Bottom > workArea.Bottom then
            y := workArea.Bottom - (RectAfter.Bottom-RectAfter.Top); //bottomEdge - heightOfForm

        x := Max(x, workArea.Left); //don't go beyond left edge
        y := Max(y, workArea.Top); //don't go above top edge
    end
    else
    begin
        x := Max(x, 0); //don't go beyond left edge
        y := Max(y, 0); //don't go above top edge
    end;

    AForm.SetBounds(x, y,
            RectAfter.Right-RectAfter.Left, //Width
            RectAfter.Bottom-RectAfter.Top); //Height
end;

এবং তারপরে আমাদের অবশ্যই পুনরাবৃত্তভাবে নতুন ফন্টটি ব্যবহার করতে হবে:

procedure StandardizeFont_ControlCore(AControl: TControl; ForceClearType: Boolean;
        FontName: string; FontSize: Integer;
        ForceFontIfName: string; ForceFontIfSize: Integer);
const
    CLEARTYPE_QUALITY = 5;
var
    i: Integer;
    RunComponent: TComponent;
    AControlFont: TFont;
begin
    if not Assigned(AControl) then
        Exit;

    if (AControl is TStatusBar) then
    begin
        TStatusBar(AControl).UseSystemFont := False; //force...
        TStatusBar(AControl).UseSystemFont := True;  //...it
    end
    else
    begin
        AControlFont := Toolkit.GetControlFont(AControl);

        if not Assigned(AControlFont) then
            Exit;

        StandardizeFont_ControlFontCore(AControlFont, ForceClearType,
                FontName, FontSize,
                ForceFontIfName, ForceFontIfSize);
    end;

{   If a panel has a toolbar on it, the toolbar won't paint properly. So this idea won't work.
    if (not Toolkit.IsRemoteSession) and (AControl is TWinControl) and (not (AControl is TToolBar)) then
        TWinControl(AControl).DoubleBuffered := True;
}

    //Iterate children
    for i := 0 to AControl.ComponentCount-1 do
    begin
        RunComponent := AControl.Components[i];
        if RunComponent is TControl then
            StandardizeFont_ControlCore(
                    TControl(RunComponent), ForceClearType,
                    FontName, FontSize,
                    ForceFontIfName, ForceFontIfSize);
    end;
end;

অ্যাঙ্করগুলি পুনরাবৃত্তভাবে অক্ষম করা হচ্ছে:

function DisableAnchors(ParentControl: TWinControl): TAnchorsArray;
var
    StartingIndex: Integer;
begin
    StartingIndex := 0;
    DisableAnchors_Core(ParentControl, Result, StartingIndex);
end;


procedure DisableAnchors_Core(ParentControl: TWinControl; var aAnchorStorage: TAnchorsArray; var StartingIndex: Integer);
var
    iCounter: integer;
    ChildControl: TControl;
begin
    if (StartingIndex+ParentControl.ControlCount+1) > (Length(aAnchorStorage)) then
        SetLength(aAnchorStorage, StartingIndex+ParentControl.ControlCount+1);

    for iCounter := 0 to ParentControl.ControlCount - 1 do
    begin
        ChildControl := ParentControl.Controls[iCounter];
        aAnchorStorage[StartingIndex] := ChildControl.Anchors;

        //doesn't work for set of stacked top-aligned panels
//      if ([akRight, akBottom ] * ChildControl.Anchors) <> [] then
//          ChildControl.Anchors := [akLeft, akTop];

        if (ChildControl.Anchors) <> [akTop, akLeft] then
            ChildControl.Anchors := [akLeft, akTop];

//      if ([akTop, akBottom] * ChildControl.Anchors) = [akTop, akBottom] then
//          ChildControl.Anchors := ChildControl.Anchors - [akBottom];

        Inc(StartingIndex);
    end;

    //Add children
    for iCounter := 0 to ParentControl.ControlCount - 1 do
    begin
        ChildControl := ParentControl.Controls[iCounter];
        if ChildControl is TWinControl then
            DisableAnchors_Core(TWinControl(ChildControl), aAnchorStorage, StartingIndex);
    end;
end;

এবং অ্যাঙ্করগুলি পুনরাবৃত্তভাবে পুনরায় সক্ষম করা হচ্ছে:

procedure EnableAnchors(ParentControl: TWinControl; aAnchorStorage: TAnchorsArray);
var
    StartingIndex: Integer;
begin
    StartingIndex := 0;
    EnableAnchors_Core(ParentControl, aAnchorStorage, StartingIndex);
end;


procedure EnableAnchors_Core(ParentControl: TWinControl; aAnchorStorage: TAnchorsArray; var StartingIndex: Integer);
var
    iCounter: integer;
    ChildControl: TControl;
begin
    for iCounter := 0 to ParentControl.ControlCount - 1 do
    begin
        ChildControl := ParentControl.Controls[iCounter];
        ChildControl.Anchors := aAnchorStorage[StartingIndex];

        Inc(StartingIndex);
    end;

    //Restore children
    for iCounter := 0 to ParentControl.ControlCount - 1 do
    begin
        ChildControl := ParentControl.Controls[iCounter];
        if ChildControl is TWinControl then
            EnableAnchors_Core(TWinControl(ChildControl), aAnchorStorage, StartingIndex);
    end;
end;

কন্ট্রোল ফন্টের বামে এখানে পরিবর্তনের কাজটি সহ:

procedure StandardizeFont_ControlFontCore(AControlFont: TFont; ForceClearType: Boolean;
        FontName: string; FontSize: Integer;
        ForceFontIfName: string; ForceFontIfSize: Integer);
const
    CLEARTYPE_QUALITY = 5;
var
    CanChangeName: Boolean;
    CanChangeSize: Boolean;
    lf: TLogFont;
begin
    if not Assigned(AControlFont) then
        Exit;

{$IFDEF ForceClearType}
    ForceClearType := True;
{$ELSE}
    if g_ForceClearType then
        ForceClearType := True;
{$ENDIF}

    //Standardize the font if it's currently
    //  "MS Shell Dlg 2" (meaning whoever it was opted into the 'change me' system
    //  "MS Sans Serif" (the Delphi default)
    //  "Tahoma" (when they wanted to match the OS, but "MS Shell Dlg 2" should have been used)
    //  "MS Shell Dlg" (the 9x name)
    CanChangeName :=
            (FontName <> '')
            and
            (AControlFont.Name <> FontName)
            and
            (
                (
                    (ForceFontIfName <> '')
                    and
                    (AControlFont.Name = ForceFontIfName)
                )
                or
                (
                    (ForceFontIfName = '')
                    and
                    (
                        (AControlFont.Name = 'MS Sans Serif') or
                        (AControlFont.Name = 'Tahoma') or
                        (AControlFont.Name = 'MS Shell Dlg 2') or
                        (AControlFont.Name = 'MS Shell Dlg')
                    )
                )
            );

    CanChangeSize :=
            (
                //there is a font size
                (FontSize <> 0)
                and
                (
                    //the font is at it's default size, or we're specifying what it's default size is
                    (AControlFont.Size = 8)
                    or
                    ((ForceFontIfSize <> 0) and (AControlFont.Size = ForceFontIfSize))
                )
                and
                //the font size (or height) is not equal
                (
                    //negative for height (px)
                    ((FontSize < 0) and (AControlFont.Height <> FontSize))
                    or
                    //positive for size (pt)
                    ((FontSize > 0) and (AControlFont.Size <> FontSize))
                )
                and
                //no point in using default font's size if they're not using the face
                (
                    (AControlFont.Name = FontName)
                    or
                    CanChangeName
                )
            );

    if CanChangeName or CanChangeSize or ForceClearType then
    begin
        if GetObject(AControlFont.Handle, SizeOf(TLogFont), @lf) <> 0 then
        begin
            //Change the font attributes and put it back
            if CanChangeName then
                StrPLCopy(Addr(lf.lfFaceName[0]), FontName, LF_FACESIZE);
            if CanChangeSize then
                lf.lfHeight := FontSize;

            if ForceClearType then
                lf.lfQuality := CLEARTYPE_QUALITY;
            AControlFont.Handle := CreateFontIndirect(lf);
        end
        else
        begin
            if CanChangeName then
                AControlFont.Name := FontName;
            if CanChangeSize then
            begin
                if FontSize > 0 then
                    AControlFont.Size := FontSize
                else if FontSize < 0 then
                    AControlFont.Height := FontSize;
            end;
        end;
    end;
end;

এটি আপনি যা ভাবেন ঠিক তার থেকে অনেক বেশি কোড; আমি জানি. দুঃখজনক বিষয় হ'ল পৃথিবীতে আর কোনও ডেল্ফি বিকাশকারী নেই, আমি ব্যতীত যারা আসলে তাদের অ্যাপ্লিকেশনগুলি সঠিক করে তোলে।

প্রিয় দেলফি বিকাশকারী : আপনার উইন্ডোজ ফন্টটি Segoe UI 14pt এ সেট করুন এবং আপনার বাগি অ্যাপ্লিকেশনটি ঠিক করুন

দ্রষ্টব্য : যে কোনও কোড পাবলিক ডোমেনে প্রকাশিত হয়। কোনও অ্যাট্রিবিউশনের প্রয়োজন নেই।


1
উত্তরের জন্য ধন্যবাদ, কিন্তু আপনি বাস্তব বিশ্বের জন্য কি পরামর্শ দিচ্ছেন? ম্যানুয়ালি সমস্ত কন্ট্রোলগুলির একটি আকার পরিবর্তন করুন?
LaBracca

3
"দুঃখজনক বিষয় হ'ল পৃথিবীতে আর কোনও ডেল্ফি বিকাশকারী নেই, আমি ব্যতীত যারা আসলে তাদের প্রয়োগগুলি সঠিক করে তোলে।" এটি খুব অহংকারী বক্তব্য যা ভুল। আমার উত্তর থেকে: প্রকৃতপক্ষে আমার স্কেলফ্র্যামস্মলফন্টসামেন্টের সংস্করণটিও ডিজাইনের সময় সেই সেট থেকে রানটাইমের সময় ফর্ম ফন্টের পরিবর্তনের সম্ভাবনার জন্য ভাতা দেয়। স্কেলিং এর জন্য অবশ্যই অ্যাকাউন্টটি আবশ্যক কারণ উত্স কোডে ব্যবহৃত পরম মাত্রা মানগুলি 96 ডিপিআই-তে 8pt তাহোমার বেসলাইনের সাথে সম্পর্কিত বলে ধরে নেওয়া হয়। আপনার ভাল উত্তর আপনি মনে, +1।
ডেভিড হেফারনান

1
@ ইয়ান আমাকে নয় যে এটি বলেছিল। ওয়ারেনের মতো শোনাচ্ছে
ডেভিড হেফারনান

2
এটি বেশ দুর্দান্ত, আয়ান। ধন্যবাদ।
ওয়ারেন পি

2
এই প্রশ্ন এবং উত্তর জুড়ে দৌড়েছে। আমি এখানে আইনের সমস্ত কোড এক কার্যকারী ইউনিটে সংগ্রহ করেছি: পেস্টবিন.ড.ডি.কেপএফএনএক্সসিএল এবং এটি Google+ এ পোস্ট করেছেন: goo.gl/0ARdq9 যে কেউ যদি এই কার্যকর লাগে তবে এখানে পোস্ট করা।
ডাব্লু.প্রিন্স

11

এই আমার উপহার। এমন একটি ফাংশন যা আপনাকে আপনার জিইউআই লেআউটে উপাদানগুলির অনুভূমিক অবস্থানের সাথে সহায়তা করতে পারে। সবার জন্য উন্মুক্ত.

function CenterInParent(Place,NumberOfPlaces,ObjectWidth,ParentWidth,CropPercent: Integer): Integer;
  {returns formated centered position of an object relative to parent.
  Place          - P order number of an object beeing centered
  NumberOfPlaces - NOP total number of places available for object beeing centered
  ObjectWidth    - OW width of an object beeing centered
  ParentWidth    - PW width of an parent
  CropPercent    - CP percentage of safe margin on both sides which we want to omit from calculation
  +-----------------------------------------------------+
  |                                                     |
  |        +--------+       +---+      +--------+       |
  |        |        |       |   |      |        |       |
  |        +--------+       +---+      +--------+       |
  |     |              |             |            |     |
  +-----------------------------------------------------+
  |     |<---------------------A----------------->|     |
  |<-C->|<------B----->|<-----B----->|<-----B---->|<-C->|
  |                    |<-D>|
  |<----------E------------>|

  A = PW-C   B = A/NOP  C=(CP*PW)/100  D = (B-OW)/2
  E = C+(P-1)*B+D }

var
  A, B, C, D: Integer;
begin
  C := Trunc((CropPercent*ParentWidth)/100);
  A := ParentWidth - C;
  B := Trunc(A/NumberOfPlaces);
  D := Trunc((B-ObjectWidth)/2);
  Result := C+(Place-1)*B+D;
end;

2
আমি আনন্দিত আপনি ওয়ারেন পছন্দ করেছেন। এটি প্রায় 15 বছর বয়সী যখন আমার যে সমস্যার সমাধান করতে হয়েছিল তার কোনও সমাধান পাওয়া যায় নি। এবং আজও এমন একটি পরিস্থিতি থাকতে পারে যেখানে এটি প্রয়োগ করা যেতে পারে। বি-)
অভ্রা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.