2010-07-06 15 views
8

पर किसी छवि के रूप में एक फ़ॉर्म के रूप में प्रतिलिपि कैसे बना सकता हूं, मुझे क्लिपबोर्ड पर एक फॉर्म (डेल्फी 2007) की प्रतिलिपि बनाने की आवश्यकता है ताकि उपयोगकर्ता एक शब्द दस्तावेज़ में क्या देख सके। क्लिपबोर्ड हिस्सा वास्तव में एक समस्या नहीं है। सवाल यह है कि फ़ॉर्म के लिए बिटमैप कैसे प्राप्त करें।मैं क्लिपबोर्ड

खोज ने कई विकल्प बदल दिए हैं।

  • कॉल GetFormImage
  • उपयोग PrintWindow API function कि GDI का हिस्सा +
  • का उपयोग कर मौजूदा फार्म के लिए कैनवास भेजें एक WM_PRINT message
  • कॉपी है Canvas.CopyRect
  • मैं भी एक घटक TExcellentFormPrinter कहा जाता है कि पाया एक समाधान जो इन विकल्पों में से किसी भी से बेहतर काम करने का दावा करता है, लेकिन मुझे नहीं पता कि यह किस विधि का उपयोग कर रहा है।

इन सभी विकल्पों में अलग-अलग समस्याएं प्रतीत होती हैं। मुझे जो जानकारी मिल रही है, वह पुरानी प्रतीत होती है। मुझे कोई अच्छा स्रोत नहीं दिख रहा है जो विकल्प बनाने के लिए मेरे लिए पर्याप्त विस्तार से विभिन्न विकल्पों की तुलना करता है। कोई सलाह जिस पर जाने का विकल्प है।

मैंने इन्हें अपने फॉर्म पर आजमाया है और वे सभी ठीक काम करने लगते हैं, मैं बस सड़क से नीचे समस्याओं से बचने की कोशिश कर रहा हूं। किस समाधान के साथ जाने के लिए कोई सलाह है?

अपडेट: GetFormImage के साथ संभावित समस्याएं क्या हैं?
एंड्रियास ने पूछा कि समस्या GetFormImage के साथ क्या है। उम्मीद है कि अब और कुछ नहीं, यह वह हिस्सा है जिसका मैं जवाब पाने की कोशिश कर रहा हूं। मुझे क्या चिंता है कि मेरे कई खोज परिणाम GetFormImage का उपयोग करने के लिए रचनात्मक विकल्प सुझा रहे हैं। मैं उम्मीद कर रहा था कि जवाब थोड़ा सा पानी साफ कर देगा।

मैं वास्तव में एक ऐसे उत्तर से खुश हूं जिसने बहुत सारे वोट प्राप्त किए हैं - कहा कि GetFormImage में कुछ समस्याएं थीं लेकिन अब इसका उपयोग करने का कोई कारण नहीं है। :-)

GetFormImage के साथ वास्तविक समस्या के रूप में। कुछ उपयोगकर्ताओं के लिए एक मुद्दा छवि का केवल दृश्य हिस्सा छवि में दिखाई देगा (यानी आप एक छिपी हुई या ओवरलैप्ड विंडो को कैप्चर नहीं कर सकते)। यह वास्तव में मेरे लिए एक मुद्दा नहीं है क्योंकि मेरा पूरा रूप दिखाई दे रहा है।

1) बड़े मुद्दे आपके फॉर्म पर नियंत्रण से आवश्यक विशिष्ट समर्थन के साथ सौदा करते हैं। Delphi 4 Fixes and Known issues page सूची में यह प्रविष्टि है (ध्यान दें कि इसे "अग्रेषित" के रूप में सूचीबद्ध किया गया है)।

क्षेत्र:: मैं एक QC प्रविष्टि है कि इस का समाधान से पता चला नहीं पा सके vcl \ कोर vcl कक्षाएं

संदर्भ संख्या: 1088 (प्रकाशित: 12/16/98)
स्थिति: अगली
लिए स्थगित Rel तिथि की सूचना दी: 8/6/98 गंभीरता: आमतौर पर आई प्रकार: बेसिक
कार्यक्षमता विफलता समस्या:

समस्या comboboxes, आदि जैसे GetFormImage सबसे घोंसला खिड़कियों नियंत्रण के साथ है खाली तैयार कर रहे हैं।

2) मैं DevExpress नियंत्रण का भी उपयोग कर रहा हूं।एक समय में उनके नियंत्रण (2006 के अंत में तय) did not support the PaintTo संदेश जो GetFormImage का उपयोग कर रहे थे। यह DevExpress रिलीज में तय किया गया है जिसका उपयोग मैं कर रहा हूं, लेकिन यह मेरे साथ अन्य मुद्दों को उठाता है, मुझे लगता है कि मैं जिस अन्य नियंत्रण का उपयोग कर रहा हूं वह सही ढंग से काम नहीं कर सकता है?

3) यहां एक और हालिया (2010) post on the Embarcadero Groups है। उपयोगकर्ता को GetFormImage का उपयोग करने में परेशानी हो रही थी, जहां वे स्क्रीन पर दिखाए गए ग्राफ का हिस्सा अंतिम छवि में प्रकट नहीं हुए थे। उन्हें फॉर्म कैप्शन भी शामिल किया गया था (जो मैं नहीं करता) और उन्होंने कैनवास लिया। कॉपरेक्ट दृष्टिकोण outlined in this post

4) यहां TExcellentImagePrinter पृष्ठ का उद्धरण दिया गया है। यदि आवश्यक हो तो मुझे उनके उत्पाद को खरीदने में कोई समस्या नहीं होगी। ऐसा लगता है कि 2002 में आखिरी बार अपडेट किया गया था (हालांकि डेल्फी 2007 परीक्षण संस्करण है)। मैं यह नहीं बता सकता कि मुझे वास्तव में उस दिशा में जाना है या नहीं।

आप GetFormImage या फॉर्म.प्रिंट का उपयोग करने का प्रयास कर सकते हैं। एक कॉम्बोबॉक्स को एक फॉर्म पर नीचे छोड़ने का प्रयास करें, फिर GetFormImage या Form.Print पर कॉल करें। यदि आपको प्रिंटआउट मिलता है, तो क्या आप कॉम्बोबॉक्स में टेक्स्ट देखते हैं? नहीं? कोई भी और भी नहीं करता है! यह का केवल एक छोटा उदाहरण है जब आप प्रिंटिंग वीसीएल फॉर्मों के दौरान सामना करेंगे।

आप बोर्लैंड के टीआई -3155 का उपयोग करने का भी प्रयास कर सकते हैं " फ़ॉर्म मुद्रित करने का एक बेहतर तरीका"। मैंने टीआई लिखा जब मैंने बोरलैंड पर स्टॉप गैप उपाय के रूप में काम किया। जबकि यह कम्बोबॉक्स टेक्स्ट प्रिंट करेगा, कई प्रिंटर पर असफल हो जाएगा, यह पूरे फॉर्म को प्रिंट नहीं कर सकता है यदि आपके उपयोगकर्ता के पास फॉर्म का आकार बदल गया है, और यह रूपों को प्रिंट से छिपा नहीं सकता है या है स्क्रीन से आंशिक रूप से स्थित है। कोड मूल रूप से एक स्क्रीनशॉट, उत्पन्न करता है और एक छवि को विश्वसनीय रूप से प्रिंट करने के लिए, आप शायद हमारे TExcellentImagePrinter उत्पाद पर एक नज़र डालना चाहते हैं! क्यों? सीधे शब्दों में कहें, को प्रिंट करने के लिए बिटमैप्स प्राप्त करने के लिए निम्न स्तर ग्राफिक्स कोड की हजारों लाइनों की आवश्यकता हो सकती है।

+4

GetFormImage के साथ समस्या क्या है? –

+0

मैंने GetFormImage के साथ अपनी चिंताओं पर अधिक जानकारी शामिल करने के लिए प्रश्न को अद्यतन किया। –

+0

मैं वर्तमान में GetFormImage, Canvas.CopyRect (और किसी भी बिटब्लैट/स्ट्रेचब्लैट संस्करण) और प्रिंटविंडो के मुद्दों से लड़ रहा हूं: उनमें से कोई भी फॉर्म पर खींची गई वास्तविक सामग्री नहीं प्राप्त कर रहा है। मेरा रूप कुछ क्षेत्रों में कस्टम-खींचा गया है, और बहुत समय में एक और खिड़की हो रही है, इसलिए मुझे कैप्चर में भी शामिल किया गया है। अगर मैं समाधान ढूंढने का प्रबंधन करता हूं, तो मैं एक उत्तर पोस्ट करूंगा। लेकिन ध्यान दें कि कुछ परिदृश्यों में, जब आपका लक्ष्य प्रपत्र छिपा हुआ है, स्क्रीन से बाहर या किसी अन्य विंडो द्वारा अस्पष्ट, उपरोक्त उल्लिखित समाधानों में से कोई भी सही तरीके से काम नहीं करेगा। – ciuly

उत्तर

8

मैं क्या समस्या GetFormImage साथ है पता नहीं है, लेकिन एक विकल्प है कि आप प्रयास नहीं किया है (कम से कम नहीं स्पष्ट रूप से) मैं इस निर्माण करने के लिए उम्मीद करेंगे लगभग सभी मामलों में

procedure TForm1.FormClick(Sender: TObject); 
var 
    bm: TBitmap; 
begin 

    bm := TBitmap.Create; 
    try 
    bm.SetSize(ClientWidth, ClientHeight); 
    BitBlt(bm.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, Canvas.Handle, 0, 0, SRCCOPY); 
    Clipboard.Assign(bm); 
    finally 
    bm.Free; 
    end; 

end; 

है

Clipboard.Assign(GetFormImage); 

के समान परिणाम। (इसके अलावा, Canvas.CopyRect प्रक्रिया StretchBlt जो मैं जब कोई खींच लागू किया जाता है BitBlt रूप में एक ही परिणाम उपज की उम्मीद करेंगे employes।)

विधि 2

तुम हमेशा प्रिंट स्क्रीन का उपयोग कर सकते हैं:

procedure TForm1.FormClick(Sender: TObject); 
begin 
    keybd_event(VK_SNAPSHOT, 1, 0, 0); 
end; 

यह सीमा और शीर्षक पट्टी पर भी कब्जा करेगा।यदि आप केवल ग्राहक क्षेत्र प्राप्त करना चाहते हैं, तो आप छवि को क्रॉप कर सकते हैं:

procedure TForm1.FormClick(Sender: TObject); 
var 
    bm, bm2: TBitmap; 
    DX, DY: integer; 
begin 
    Clipboard.Clear; 
    keybd_event(VK_SNAPSHOT, 1, 0, 0); 
    repeat 
    Application.ProcessMessages; 
    until Clipboard.HasFormat(CF_BITMAP); 
    bm := TBitmap.Create; 
    try 
    bm.Assign(Clipboard); 
    bm2 := TBitmap.Create; 
    try 
     bm2.SetSize(ClientWidth, ClientHeight); 
     DX := (Width - ClientWidth) div 2; 
     DY := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME); 
     BitBlt(bm2.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, bm.Canvas.Handle, DX, DY, SRCCOPY); 
     Clipboard.Assign(bm2); 
    finally 
     bm2.Free; 
    end; 
    finally 
    bm.Free; 
    end; 
end; 
+0

एंड्रियास पर कब्जा नहीं किए गए हैं, वहां कुछ शानदार विकल्प हैं, लेकिन यह अभी भी मुझे किस विशिष्ट विकल्प का उपयोग करने के सवाल के साथ छोड़ देता है। चूंकि ये सब एक ही जवाब में हैं, मैं यह नहीं बता सकता कि कौन सा विकल्प सबसे अधिक वोट प्राप्त कर रहा है। –

+2

आपको * आपके लिए * काम करने वाली सबसे सरल विधि चुननी चाहिए। यदि आपको * परियोजना में 'GetFormImage' के साथ कोई समस्या नहीं आती है, तो, हर तरह से, इसका उपयोग करें! –

+0

GetFormImage अभी भी डेल्फी 10.1 बर्लिन में ठीक से काम नहीं करता है। जैसे मेरे फॉर्म पर TRichEdit घटक कब्जा नहीं कर रहे हैं – DaveBoltman

संबंधित मुद्दे