Προς το περιεχόμενο

Delphi 2005 και ελληνικά


takis456

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω φτιάξει μια εφαρμογή σε Delphi και έχω βάλει ένα TMemo. Στο Font του TMemo έχω ορίσει σαν charset το GREEK_CHARSET. Όταν γράφω ελληνικά ή κάνω κάτι paste στο TMemo, τότε όλα δουλεύουν μια χαρούλα. Όταν όμως πάω να κάνω κείμενο αντιγραφή από το TMemo για να το κάνω paste κάπου (πχ στο notepad ή σε κάποια σελίδα) τότε εμφανίζονται τα περίεργα συμβολάκια (π.χ. αγγλικό ερωτηματικό). Έχει κανείς καμία ιδέα για το πως να λύσω το πρόβλημα?

Δημοσ.
Έχω φτιάξει μια εφαρμογή σε Delphi και έχω βάλει ένα TMemo. Στο Font του TMemo έχω ορίσει σαν charset το GREEK_CHARSET. Όταν γράφω ελληνικά ή κάνω κάτι paste στο TMemo, τότε όλα δουλεύουν μια χαρούλα. Όταν όμως πάω να κάνω κείμενο αντιγραφή από το TMemo για να το κάνω paste κάπου (πχ στο notepad ή σε κάποια σελίδα) τότε εμφανίζονται τα περίεργα συμβολάκια (π.χ. αγγλικό ερωτηματικό). Έχει κανείς καμία ιδέα για το πως να λύσω το πρόβλημα?

 

Το πρόβλημα προέρχεται από το γεγονός ότι δεν πρόκειται για Unicode εφαρμογή οπότε όταν αντιγράφεις τα δεδομένα του TMemo στο Πρόχειρο, τα οποία δεδομένα περιέχουν ελληνικούς χαρακτήρες, θα πρέπει να γυρίζεις την γλώσσα του πληκτρολογίου σου πρωτύτερα στα Ελληνικά ώστε τα Windows να αποθηκεύουν στο πρόχειρο (μαζί με το κείμενο που έχεις αντιγράψει και) τις κατάλληλες πληροφορίες (LOCALE) που εξηγούν σε τι γλώσσα είναι γραμμένα τα στοιχεία σου ώστε να μπορούν να επικολλούνται σωστά στις υπόλοιπες εφαρμογές.

 

Αυτό το πρόβλημα είναι φυσικά ενοχλητικό αλλά μπορεί να αντιμετωπιστεί είτε με αλλαγή γλώσσας πληκτρολογίου είτε με κώδικα ο οποίος θα κάνει μόνος του την αντιγραφή στην default γλώσσα του λειτουργικού συστήματος δίχως να χρησιμοποιεί τις ρουτίνες διαχείρισης του προχείρου της Delphi.

 

Πριν μερικά χρόνια .. είχα αναρτήσει έναν τέτοιο κώδικα γραμμένο για τον C++ Builder 6.0 σε Windows API, αν το πρόβλημα είναι τόσο ενοχλητικό και μπορείς να τον μετατρέψεις σε Delphi μπορεί να σου φανεί χρήσιμος (φυσικά θα βάλεις το δικό σου Menu Item για αντιγραφή κτλ): http://www.insomnia.gr/forum/showpost.php?p=449806&postcount=10

 

Υ.Γ.

1. Η Delphi 2009 είναι πλήρως Unicode οπότε δεν υπάρχει πρόβλημα.

 

2. Αν η Delphi 2005 προσφέρει κάποια άλλη λειτουργία που διορθώνει το πρόβλημα αυτό, δεν το γνωρίζω.

 

3. To Default charset (συμφωνώ με τον fromaz) θα έπρεπε να φτάνει (αφού το Default -> τα ελληνικά) όμως (!) φαίνεται ότι δεν λαμβάνεται υπόψη από την Delphi / C++ Builder (τουλάχιστον σε προγενέστερες εκδόσεις) καθώς περιορίζεται στο να εξηγεί το charset του TFont του TMemo και δεν λαμβάνεται υπόψη από τις ρουτίνες αντιγραφής του συγκεκριμένου component ώστε να μεταφέρεται στο ανάλογο "LOCALE block" - ελπίζω η Delphi 2005 να έχει διορθώσει αυτή την αβλεψία ώστε να μην χρειάζεται "τσόντα" κώδικας ή αλλαγή γλώσσας για την διόρθωση του (πες μας τι έγινε τελικά και αν αυτό διορθώθηκε στην Delphi 2005).

 

Καλή συνέχεια!

Δημοσ.

Σας ευχαριστώ για τις συμβουλές σας. Το GREEK_CHARSET ήταν το προεπιλεγμένο από την Delphi. Το άλλαξα σε DEFAULT_CHARSET άλλα δεν είδα κάποια αλλαγή στη συμπεριφορά του προγράμματος. Directx μπράβο, ήσουν πολύ αναλυτικός σχετικά με το τι το προκαλεί. ΣΧετικά με τις λύσεις που πρότεινες (σαν ΥΓ):

 

1) Δυστηχώς δεν έχω την 2009, αλλά φαίνεται να είναι αρκετά καλύτερη

2) Νομίζω η 2006 έχει την συνάρτηση SetMultiByteConversionCodePage η οποία αλλάζει το code page και θεωρητικά θα βελτίωνε το πρόγραμμα. Αλλά δεν λειτουργεί στην 2005.

3) Αν κατάλαβα ότι προτείνεις να αλλάξω το charset σε default, τότε αυτό δεν δούλεψε. Όπως επίσης ούτε η συνάρτηση CopyToClipboard του TMemo (δουλεύει σαν το κανονικό Copy/Paste)

 

Αλλάζοντας τη γλώσσα του πληκτρολογίου σε ελληνικά δουλεύει σωστά. Οπότε αν δεν υπάρχει κάποια πιο απλή λύση, μάλλον θα μετατρέψω τον κώδικα σου σε Delphi. ('Η εκτός και εάν ζητάω από τον user να αλλάζει γλώσσα πληκρολογίου :confused:)

Δημοσ.
3) Αν κατάλαβα ότι προτείνεις να αλλάξω το charset σε default, τότε αυτό δεν δούλεψε. Όπως επίσης ούτε η συνάρτηση CopyToClipboard του TMemo (δουλεύει σαν το κανονικό Copy/Paste)

 

Όχι δεν προτείνω κάτι τέτοιο, απλά λέω ότι σαν σκέψη έχει λογική αλλά δυστυχώς η Delphi και ο C++ Builder δεν το λαμβάνουν τελικά υπόψη τους κατά την αντιγραφή των στοιχείων στο clipboard. Είχα όμως την επιφύλαξη ότι αυτό μπορεί να είχε αλλάξει στην Delphi 2005 -αλλά προφανώς δεν συμβαίνει κάτι τέτοιο.

 

Όσον αφορά τις ρουτίνες του TMemo, ναι δεν δουλεύουν, ούτε οι ρουτίνες της VCL για το clipboard βοηθούν διότι διαγράφουν πρωτύτερα τα περιεχόμενα του clipboard οπότε δεν μπορείς να προσθέσεις περισσότερα από ένα data blocks σε αυτό μαζί τους (οπότε Windows API).

Δημοσ.
Όχι δεν προτείνω κάτι τέτοιο...

 

Θα επιμείνω, αν μου επιτρέπεις φίλτατε DirectX. Νομίζω πως είναι κρίμα να χαντακώνεται ένα πρόγραμμα με αυτήν την επιλογή η οποία ούτως ή άλλως δεν προσφέρει και τίποτα όπως αποδείχτηκε. Αν μου έχει διαφύγει κάτι, ζητώ συγγνώμη.

 

Με DEFAULT_*, το πρόγραμμά μας λειτουργεί σε οποιαδήποτε χώρα της οποίας η γλώσσα καλύπτεται με SBCS. Φυσικά και στην Ελλάδα.

 

Με GREEK_*, το πρόγραμμα θα δουλεύει μόνο στην Ελλάδα, καθώς θα έχει πρόβλημα με τους accented χαρακτήρες (8bit ASCII) των υπολοίπων γλωσσών. Δεν θα μπορεί, δηλαδή, να δουλέψει στη Γερμανία, Δανία, Ισπανία, κλπ

 

Η επιλογή του character set (όπως και το ίδιο το font dialog) είναι κατάλοιπο της εποχής των Windows 95 και δεν θα έπρεπε να υπάρχει.

 

Έχω εφαρμογή (σε Builder 6) που τρέχει σε 10άδες χιλιάδες υπολογιστές (από '95 μέχρι Vista) σε όλον τον κόσμο, και καλύπτει όλες τις Ευρωπαϊκές γλώσσες ακριβώς επειδή χρησιμοποιώ DEFAULT_*. Θυμάμαι χαρακτηριστικά, την πρώτη φορά που μου ανέφεραν πρόβλημα. Η εφαρμογή χρησιμοποιεί αρκετά TMemo (logs, scripts, κλπ) στα οποία επέλεγα Courier αντί MS Sans Serif. Με την αλλαγή του font ο Builder μου άλλαζε το character set και δεν το είχα πάρει χαμπάρι. Όταν το πήρα και το γύρισα στο DEFAULT_ όλα μια χαρά.

 

 

Υ.Γ: Το θέμα του copy στο clipboard το είχα λύσει με την εξής απλή ρουτίνα. Είναι σκουριασμένη, όχι ιδιαίτερα τσεκαρισμένη, αλλά δεν μου έχει αναφερθεί πρόβλημα:

 

>#include <Clipbrd.hpp>

void __fastcall
TMainForm::StrToClipboard(
   CONSTR S,
   DWORD ALang)
{
   HGLOBAL     hGlobal;
   DWORD      *pGlobal;
   TClipboard *CB = Clipboard();

   CB->Open();
   CB->AsText = S;
   hGlobal    = GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, sizeof(DWORD));
   pGlobal    = (DWORD*)GlobalLock(hGlobal);
  *pGlobal    = ALang;
   GlobalUnlock(hGlobal);
   CB->SetAsHandle(CF_LOCALE, (int)hGlobal);
   GlobalFree  (hGlobal);
   CB->Close();
}

Δημοσ.

Ωραία όλα αυτά που λες αλλά εξηγούμαι για να μην παρεξηγούμαι.

 

Ερωτήθηκα από το φίλο μας για το εάν του προτείνω ως λύση στο πρόβλημα της επικόλλησης ελληνικών χαρακτήρων στο Clipboard την τροποποίηση του Charset σε «default» (όπως είχε προταθεί) οπότε του εξήγησα ότι ναι μεν είναι μια ωραία σκέψη αλλά δυστυχώς δεν πρόκειται τελικά να τον βοηθήσει σε αυτό του το πρόβλημα (όπως δεν βοήθησε και εσένα που κατέφυγες τελικά στην χρήση της ρουτίνας που παρέθεσες –απορώ γιατί δεν του την πρότεινες ως λύση εξ αρχής). Παράλληλα καθώς δεν διαθέτω την Delphi 2005 (αλλά τον Turbo C++ 2006) άφησα ένα μικρό περιθώριο μιας πιθανότητας αυτό να έχει αλλάξει, πράγμα που δεν συνέβη τελικά.

 

Νομίζω ότι το τοπίο ξεκαθαρίσθηκε από μέρους μου, φίλε fromaz.

 

Υ.Γ.

Ωραία compact ρουτίνα, συγχαρητήρια, φρόντισε όμως να αφαιρέσεις το GlobalFree διότι κάθε MOVABLE μνήμη που παρέχεται στο Clipboard παύει να ανήκει στην διεργασία που την δέσμευσε, σε διαφορετική περίπτωση η ρουτίνα λειτουργεί άπαξ, δηλαδή κάνει ένα πετυχημένο Copy και ύστερα (αν ξανά ζητηθεί) παύει να λειτουργεί δίχως κανένα σφάλμα (οπότε μπορεί να μην το πάρεις χαμπάρι), τουλάχιστον σε C++ Builder 6 που έχω διαθέσιμο αυτή την στιγμή (οκ δεν την έχεις τεστάρει ιδιαίτερά, αλλά μιας και μπορεί να ενδιαφερθεί κάποιος άλλος user κάποια στιγμή στο μέλλον, απλά το καταθέτω).

 

Καλές εορτές!!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...