עזרה עם gtk_button_set_label

כרמית ש1

New member
עזרה עם gtk_button_set_label

שלום,
אני צריכה לעדכן כיתוב על BUTTON. אני משתמשת ב- gtk_button_set_label.
הבעיה שלי היא שאני רוצה לעדכן את הכיתוב על הכפתור בשתי שורות שמתקבלות מערכים בטבלה,
כלומר, נניח קוד מוצר ושם מוצר (אמור להופיע על הכפתור מספר המוצר ומתחתיו שם המוצר). כך:
12
לחם
ניסיתי להכניס לתוך string את שני הערכים עם \n ביניהם, ולהשתמש בו ב-gtk_button_set_label אבל זה מעיף אותי החוצה.
אם אני שמה ב- gtk_button_set_label:
"לחם \n י12" באופן ישיר - זה עובד ומציג זאת על הכפתור.
אם אני מכניסה את המחרוזת לתוך string, ונותנת אותו בתור ארגומנט - התוכנית עפה.
אני חייבת להשתמש ב- string היות והנתונים נשלפים מטבלה ומשתנים.

צריכה עצה. מה אני יכולה לעשות? האם יש דרך להעביר מחרוזת כזו מבלי לעוף מהתוכנה?

תודה רבה!!!
 

כרמית ש1

New member
לצערי זה לא עוזר...

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

BravoMan

Active member
אי אפשר לפתור בעיה בקוד בלי לראות את הקוד,

או לפחות את חלקו הרלוונטי, אבל הנה הניחוש שלי:
קיימת רק גרסה אחת של gtk_button_set_label, היות ושפת C (שבה GTK כתובה) לא מאפשרת העמסת פונקציות.

היא יודעת לקבל רק מצביע למערך של gchar.

נראה שאת משתמשת במבנה נתונים כלשהו שנקרא string.
לא ברור מהיכן הוא הגיע, זה לא משהו סטנדרטי ששייך לשפת C, אבל לפני שתוכלי להשתמש בו עם פונקציות של GTK, תצטרכי קודם כל להפוך את התוכן שלו למערכך של gchar.

אם תתני קצת יותר פרטים על המבנה הזה, אולי אפשר יהיה לעזור...
 

כרמית ש1

New member
הצילו!! מה הבעייה כאן???

תודה על התגובות.
אז ככה. זה כן מצליח להציג את המחרוזת, אך זה מוגבל ביותר!!
אם המחרוזת היא למשל: "1\nאפרסק" זה כבר עף ("1\nאפרס" זה כן נותן). אבל, אם מכניסים ישירות ל-gtk_button_set_label() זה מצליח עם מחרוזות ארוכות הרבה יותר.
במקרה שלי: יש לי מערך של buttons בשם arr, ומחרוזת str:
Gchar str[10]={0};
PRODUCT_STRUCT prod;
בתוך לולאה שרצה על מערך ה-buttons
}
איפוס prod
If(strcmp(prod.name, "")==0) /* no prodect name */
{
Sprint(str," %d", prod.number); /* present only product number */
{
Else ) /* has prodect name */
{
Sprint(str," %d\n%s", prod.number, prod.name); /* present product number+name */
{
Gtk_button_set_label(prod, str);
/* buttons loop*/{

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

האם יש הגדרה כלשהי לגבי אורך ה-label של גבי ה-button?
האם יש דרך אחרת להציג מחרוזת על button? למשל, לשים label על button או משהו בסיגנון?
תודה רבה!
 
מה יקרה אם תחליפי את

ההצבה שלך, בהצבה הבאה:

Sprint(str," %s", prod.name); /* present product number+name */


(בתפוז, כדי ליצור הצמדה לשמאל של קוד, יש להתחיל במחרוזת |הקוד | (ללא הרווח בין ההקוד ובין ה|), ובסיום הקוד להשתמש בסקוד באותו האופן.
 

BravoMan

Active member
נראה שהבעיה בקוד היא חריגה בזיכרון:

המערך str קטן מידי, וכשאת חורגת מהגודל שלו (מנסה להכניס טקסט ערוך מידי) התוכנית עפה.

כברירת מחדל, GTK עובדת עם קידוד UTF-8.
בקידוד זה, כל תו עברי דורש שני תאים מסוג gchar (שהוא למעשה char או בית אחד בזיכרון) ותו אנגלי או ספרה דורשים gchar אחת (כולל תו n\).

בנוסף, מחרוזת צריכה תו נועל, תו 0 כך שאם את רוצה לאחסן את המחרוזת "אפרסק\n1" את צריכה להגדיר את str שיהיה לפחות בגודל 13.
 

כרמית ש1

New member
תודה תודה תודה!!!!

אכן הבעיה היא גודל המערך!
לא התייחסתי לעובדה שתווים בעברית דורשים יותר זיכרון!!!
תודה רבה על העזרה!!!
 
למעלה